ORM لـ PHP: مقارنة وأمثلة
ORM (تعيين الكائنات العلائقية) — هو طبقة وسيطة بين كود PHP وقاعدة البيانات العلائقية. يحول صفوف الجداول إلى كائنات، واستعلامات SQL إلى دوال. يوجد العديد من حلول ORM الناضجة لـ PHP. في هذه المقالة سنستعرض ثلاثة من أشهرها: Doctrine و Eloquent (من Laravel) و Cycle. ستتعرف على فلسفتها، تركيبها، وستحصل على أمثلة كود جاهزة.
1. Doctrine ORM — Data Mapper
Doctrine — أقوى وأكثر ORM نضجًا لـ PHP. يستخدم نمط Data Mapper: الكيانات (Entity) لا تعلم عن قاعدة البيانات، وكل العمل مع قاعدة البيانات يتم عبر المستودعات ومدير الكيانات EntityManager.
// مثال لكيان في Doctrineuse Doctrine\\ORM\\Mapping as ORM;
/** * @ORM\\Entity * @ORM\\Table(name="users") */class User{ /** @ORM\\Id @ORM\\Column(type="integer") @ORM\\GeneratedValue */ private int $id;
/** @ORM\\Column(type="string", length=100) */ private string $name;
public function getName(): string { return $this->name; }
public function setName(string $name): void { $this->name = $name; }}
// الحفظ والاسترجاع$user = new User();$user->setName('أليكسي');$entityManager->persist($user);$entityManager->flush();
$users = $entityManager->getRepository(User::class)->findAll();2. Eloquent ORM — Active Record
Eloquent — ORM من إطار العمل Laravel. يستخدم نمط Active Record: كل كائن يعرف بنفسه كيف يحفظ نفسه في قاعدة البيانات. الكود مضغوط وبديهي، مثالي للتطوير السريع.
// نموذج Eloquentuse Illuminate\\Database\\Eloquent\\Model;
class User extends Model{ protected $table = 'users'; protected $fillable = ['name'];}
// إنشاء سجل$user = User::create(['name' => 'ماريا']);
// القراءة$users = User::where('name', 'like', '%ما%')->get();
foreach ($users as $user) { echo $user->name;}
// التحديث$user = User::find(1);$user->name = 'أولغا';$user->save();3. Cycle ORM — نهج هجين
Cycle — ORM حديث من مؤلفي إطار العمل Spiral. يجمع أفضل ميزات Data Mapper و Active Record. يعمل أسرع من Doctrine بفضل تخزين المخطط مؤقتًا وغياب السحر. يدعم الكتابة الصارمة.
// كيان Cycleuse Cycle\\Annotated\\Annotation as Cycle;
/** * @Cycle\\Entity * @Cycle\\Table(name="users") */class User{ /** @Cycle\\Column(type="primary") */ public int $id;
/** @Cycle\\Column(type="string") */ public string $name;}
// الحفظ$user = new User();$user->name = 'إيفان';$orm->persist($user);$orm->run();
// البحث$users = $orm->getRepository(User::class)->select()->fetchAll();مقارنة ORM لـ PHP
| الخاصية | Doctrine | Eloquent | Cycle |
|---|---|---|---|
| النمط | Data Mapper | Active Record | هجين |
| الأداء | متوسط | عالي (مع التخزين المؤقت) | عالي |
| الارتباط بإطار العمل | مستقل | Laravel | Spiral / مستقل |
| توليد الترحيلات | مدمج | عبر Artisan |
أيضاً في المكتبةتوصيات |