ORM لـ PHP: نظرة عامة ومقارنة للمكتبات الشائعة
ORM (Object-Relational Mapping) هي تقنية تتيح العمل مع قواعد البيانات من خلال كائنات لغة البرمجة، بدلاً من استعلامات SQL. في PHP، توجد عدة مكتبات ORM قوية، لكل منها ميزاتها ومزاياها وعيوبها. في هذه المقالة، سنقارن بالتفصيل بين أربعة من أشهر الحلول: Doctrine وEloquent وPropel وRedBeanPHP. ستتعرف على كيفية عملها، وسترى أمثلة على الكود، وستتمكن من اتخاذ قرار واعٍ لمشروعك.
1. Doctrine — تحكم كامل و DQL قوي
Doctrine هو أكثر ORM نضجًا وثراءً من حيث الوظائف في PHP. يتكون من مكونين: DBAL (طبقة تجريد قاعدة البيانات) و ORM (رسم الخرائط العلائقية للكائنات). يستخدم Doctrine نمط Data Mapper، مما يعني الفصل التام بين منطق الأعمال ومنطق تخزين البيانات.
الميزات الرئيسية:
- دعم كامل لـ Doctrine Query Language (DQL) — SQL موجه للكائنات
- نظام ترحيل مرن (Doctrine Migrations)
- تحميل العلاقات الكسول والنشط (Lazy/Eager Loading)
- دعم دورة حياة الأحداث للكيانات
- ذاكرة تخزين مؤقت مدمجة (للبيانات الوصفية والاستعلامات والنتائج)
مثال على الكود:
<?php// تعريف الكيان (Entity)use 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;
/** @ORM\\Column(type="string", unique=true) */ private string $email;
// الدوال المساعدة (Getters و Setters) public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } public function getEmail(): string { return $this->email; } public function setEmail(string $email): void { $this->email = $email; }}
// الاستخدام$entityManager = EntityManager::create($connectionParams, $config);$user = new User();$user->setName('إيفان بيتروف');$user->setEmail('ivan@example.com');$entityManager->persist($user);$entityManager->flush();
// استعلام عبر DQL$query = $entityManager->createQuery('SELECT u FROM App\\Entity\\User u WHERE u.email = :email');$query->setParameter('email', 'ivan@example.com');$result = $query->getOneOrNullResult();2. Eloquent — البساطة والأناقة (Laravel)
Eloquent هو ORM المضمن في إطار العمل Laravel، ولكنه متاح أيضًا للاستخدام بشكل منفصل عبر حزمة illuminate/database. يستخدم نمط Active Record، حيث يمثل كل نموذج صفًا في جدول قاعدة البيانات. يشتهر Eloquent بتركيبته البديهية وإدارته التلقائية للعلاقات.
الميزات الرئيسية:
- إعدادات ضئيلة — الاتفاقيات بدلاً من التهيئة
- علاقات قوية: belongsTo, hasMany, belongsToMany وغيرها
- إدارة تلقائية للطوابع الزمنية (created_at, updated_at)
- نطاقات مدمجة، محولات (mutators) وملحقات (accessors)
- دعم المجموعات والترقيم
مثال على الكود:
<?phpuse Illuminate\\Database\\Eloquent\\Model;
class User extends Model{ protected $table = 'users'; protected $fillable = ['name', 'email']; protected $hidden = ['password'];
// علاقة "واحد إلى متعدد" public function posts() { return $this->hasMany(Post::class); }}
// إنشاء سجل$user = User::create([ 'name' => 'آنا سميرنوفا', 'email' => 'anna@example.com',]);
// استعلام مع شروط$activeUsers = User::where('status', 'active')