ORM لـ PHP: مقارنة بين Doctrine و Eloquent و Propel مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ORM لـ PHP: مقارنة بين Doctrine و Eloquent و Propel



التعيين الكائني-العلائقي (ORM) هو تقنية تتيح للمطورين العمل مع قواعد البيانات باستخدام نهج كائني التوجه بدلاً من كتابة استعلامات SQL الخام. توجد عدة حلول ORM ناضجة للغة PHP، لكل منها نقاط قوته. في هذه المقالة، سنقارن بالتفصيل بين ثلاثة من أشهر أنظمة ORM: Doctrine و Eloquent (من Laravel) و Propel، وسنقدم أمثلة عملية على الكود.



1. Doctrine: DataMapper القوي



Doctrine هو بلا شك أكثر أنظمة ORM نضجًا وثراءً بالميزات للغة PHP. يطبق نمط DataMapper، مما يعني الفصل التام بين منطق الأعمال ومنطق التعامل مع قاعدة البيانات. الخصائص الرئيسية:



  • دعم أنظمة قواعد بيانات متعددة (MySQL, PostgreSQL, SQLite, Oracle, MSSQL)
  • نظام استعلامات مرن عبر DQL (Doctrine Query Language)
  • دعم مدمج للترحيلات (migrations)، الأحداث، الكائنات الوسيطة (التحميل البطيء)
  • أداء عالٍ عند ضبط التخزين المؤقت بشكل صحيح


مثال: تعريف كيان واستعلام



// كيان Useruse Doctrine\\ORM\\Mapping as ORM;

#[ORM\\Entity]#[ORM\\Table(name: "users")]class User{ #[ORM\\Id] #[ORM\\GeneratedValue] #[ORM\\Column(type: "integer")] private int $id;

#[ORM\\Column(type: "string", length: 100)] private string $name;

#[ORM\\Column(type: "string", length: 255, unique: true)] private string $email;

// الدوال المساعدة (Getters و Setters) public function getId(): int { return $this->id; } 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$userRepository = $entityManager->getRepository(User::class);$users = $userRepository->findBy(['name' => 'إيفان'], ['id' => 'DESC'], 10);foreach ($users as $user) { echo $user->getName() . ' - ' . $user->getEmail() . PHP_EOL;}


2. Eloquent: البساطة والأناقة



Eloquent هو ORM القياسي لإطار العمل Laravel، ويطبق نمط ActiveRecord. كل نموذج هو في نفس الوقت كيان ومستودع. المزايا الرئيسية:



  • أقل كود مطلوب للعمليات القياسية
  • واجهة fluent جميلة لبناء الاستعلامات
  • علاقات مدمجة (belongsTo, hasMany, morphMany، إلخ)
  • توثيق ممتاز ومجتمع ضخم


مثال: النموذج والاستعلامات



// نموذج User (ملف app/Models/User.php)namespace App\\Models;

use Illuminate\\Database\\Eloquent\\Model;

class User extends Model{ protected $fillable = ['name', 'email']; // تعريف علاقة "واحد إلى متعدد" public function posts() { return $this->hasMany(Post::class); }}

// الاستخدام في المتحكم (Controller)$users = User::where('name', 'LIKE', '%إيفان%') ->orderBy('created_at', 'desc') ->limit(10) ->get();

foreach ($users as $user) { echo $user->name . ' - ' . $user->email . PHP_EOL; // التحميل البطيء للسجلات المرتبطة foreach ($user->posts as $post) { echo ' منشور: ' . $post->title . PHP_EOL; }}


3. Propel: الأداء وتوليد الكود



Propel هو ORM يقوم بتوليد الفئات بناءً على مخطط قاعدة البيانات (XML أو YAML). يستخدم نمط ActiveRecord، ولكن مع التركيز على الأداء والكتابة الصارمة للأنواع. الميزات الرئيسية:



  • توليد فئات النماذج (لا حاجة لكتابة الدوال المساعدة يدويًا)
  • مدمج

توصيات