Orm مقدمة

Orm مقدمة

من فترة لم أكتب درس عن شئ في لغة php ومنذ قليل وأنا أحضر ما سأقولو اليوم عن ORM في السحور التقني فقولت أضع هذا التحضير كنقاط أساسية لقلة المصادر العربية التي تتحدث عن هذا الموضوع.

ORM وهي أختصار لـ object-relational mapping يمكن يكون ترجمة للمصطلع هو "كائن رسم خرائط العلاقات" ولكنها ترجمه غير دقيقة بشكل كبير ولكني لم أحصل على بديل (أتمنى تصلحلي هذا المصطلح) وهو يعتبر كائن تمثيل العلاقات بين جداول قاعدة البيانات التي تعمل معها.

حتى الأن أعلم انك لم تستفيد ... حسناً، بكل بساطة ما هي الأستفادة من تمثيل هذه العلاقات او البيانات بشكل أخص !! هي تمثلها على شكل كائنات وصفات .. نعم، كمثال تخيل أن هناك جدولين أحدهما للأقسام والأخر للمنتجت بداخله، والعلاقية بينهم many to one وأكيد ال one هو القسم، فبالتالي يكون عندنا تمثيلهم كفأتين 2 class ، أحدهما يمثل جدول القسم والأخر يمثل المنتجات، وبينهما method وسيطة وهي التي تمثل حقل الربط.

هنا عند التعامل مع record في جدول المنتجات فهو سيكون عبارة عن كائن مورث من كائن المنتجات المورث من كائن القسم، طبعاً وراثته من كائن القسم تكون في خصائص الربط فقط.

بماذا تيفيديني كل هذه العمليات !! عندما تتعامل مع قاعدة البيانات عن طريق ال ORM فأنت تربح الكثير من الأمكانيات الأخرى ككونه وسيط بينك وبين أي نوع قاعدة بيانات، كما أنه سيقوم بعمل معظم ما تحتاجه في الـ model إذا كنت تعمل على MVC مثلاً، كما أنه .... هناك الكثير ولكن هذا ليس وقته.

ORM لا يقتصر تعامله على لغة بعينها أو برنامج معين بل أنه مصطلع برمجي عام كالـ MVC مثلاً ويمكنك التعامل به بشكل منفصل او داخل إطار عمل معين تحب أستخدامه.

في PHP يمكنك أستخدامع مع أي أطار عمل عام كـ CI أو ZFM أو symfony أو .... ألخ، او حتى إطار عمل خاص بك، وحتى لو لم تستعمل إطار عمل أو كان طريقة برمجتك بدائية جداً من وجهة نظرك فإن الـ ORM سيفيدك التعامل معه وسيوفر عليك الكثير ويضمن لك المزيد من الجودة في العمل.

نبدأ ... أكيد PHP

في PHP يوجد هناك cakephp والذي يحتوى على ORM مدمج ولكني لم أستخدمه، أما أي أطار عمل أخر فمنهم من يعتمد على كائنات عامة وتأتي بشكل مدمج بداخله كـ symfony ومنهم من يحتاج لدمجه معهم كـ CI أو ZFM وبطريقى سهلة جداً وموجود أمثلة كثيرة عملية على الأنترنت.

ما هي كائنات ORM الموجودة للـ PHP ؟

أشهر الموجود هو Doctraine وPropel، وعن نفسي أستخدمت الأولى أكثر في أطار عمل symfony عندما كنت اعمل في إمارة مكة، رغم اني أستخدمت الأثنين للتجربة لكن كان اختيار زميل العمل صدري صحراوي لي هو Doctraine ولهذا أستخدمته أكثر.

البداية بكل بساطة أن عليك تكوين قاعدة بيناتك في ملف بصيغة yml لتكوين جداولك وعلاقاتها ببعض، وهذا مثال بسيط من موقع Doctraine

User:
  columns:
    id:
      primary: true
      autoincrement: true
      type: integer(4)
    username: string(255)
    password: string(255)
  relations:
    Groups:
      class: Group
      refClass: UserGroup
      foreignAlias: Users

Group:
  tableName: groups
  columns:
    id:
      primary: true
      autoincrement: true
      type: integer(4)
    name: string(255)

UserGroup:
  columns:
    user_id: integer(4)
    group_id: integer(4)
  relations:
    User:
      onDelete: CASCADE
    Group:
      onDelete: CASCADE

وهنا بكل بساطة أصبح لدينا 3 كائنات و3جداول، وكل كائن هو لجدول بنفس الأسم عدا جدول groups سيكون الكائن الخاص به بأسن Group وطبعاً هذا من السطر tableName: groups. طبعاً لا يحتاج أي سطر لشرحه لمن لديه معرفة في العلاقات داخل قواعد البيانات، وطبعاً هذا غير قائم في قواعد بيانات MySql من نوع MyIsam والمعتاد أستخدامها ولكن MySql توفرها في قواعد بيانات من نوع InnoDB وهي لا تحتاج غير تغير نوع الجدول عن أنشائه فقط ثم عليك أضافة بعض الأسطر الخاصة بالعلاقات المطلوبة أثناء إنشائك لجداول قاعدة البيانات. طبعاً هذه العلاقات موجوده في أي قاعدة بيانات اخرى أفتراضياً أي كان نوعها.

أيضاً كان اكمال المثال ببيانات أفتراضية يمكنك وضعها في قاعدة البيانات عند أنشائك للكائنات اول مرة، وهذا مثال للملف بصيغة yml أيضاً

User:
  zyne:
    username: zYne-
    password: changeme
    Groups: [founder, lead, documentation]
  jwage:
    username: jwage
    password: changeme
    Groups: [lead, documentation]

Group:
  founder:
    name: Founder
  lead:
    name: Lead
  documentation:
    name: Documentation

طبعاً هنا تم أدخال سجلين في جدول الأعضاء وثلاثة في جدول المجموعات و5 سجلات بجدول UserGroup، اتمنى تكون الموضوع واضح ويمكنك طلب النزضيح في التعليقات أيضاً.

الأن لنبدا العمل، بعد هذا سنقوم بكتابة الأمر المسؤل عن بناء الكائنات والتي سيقوم بأنشاء جداول قاعدة البيانات في السرفر الذي ستعطيه بيناته، ثم أدخال البيانات ثم توليد ملفات PHP التي بها اكواد الفئات classes التي ستتعامل مع كائنتها فيما بعد. هذا مثال للتعامل مع السجل بطريقة "active record pattern" أو يعني ممكن نسميها نمط السجل النشط :D لا هو من رأيي يعتبر ترجمة مناسبة، أنظر المثال.

 $user = new User();
 $user->username = "Tohamy";
 $user->password = "Hiall2468";
 $user->save();
 echo "The user with id $user->id has been saved.";

هذه بكل بساطة طريقة للتعامل مع جدول User او الكائن User لأدخال سجل جديد.

هذا المقال فقط لتوضيح ما هو ORM يمكنك تجربة Doctraine من هذا المثال البسيط، كما ستجد في باقي المثال طريقة دمجه من CI وأيضاً يمكنك البحث عن طرق لدمجه مع أي أطار عمل أخر.

مصادر

  • بود كاست عن الـ ORM وأستخدامها في .NET من مدونة دوت نت عربي