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” أو يعني ممكن نسميها نمط السجل النشط
لا هو من رأيي يعتبر ترجمة مناسبة، أنظر المثال.
$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 من مدونة دوت نت عربي
لي تعليق بسيط هنا أعتقد ان تمثيل علاقات قواعد البيانات هنا في البيئة الكائنية هي علاقة إحتواء و ليست وراثة أي composition و ليست inheritances يعني أن المنتجات ستكون كمتغير في فئة القسم
أعتقد توضيحك أكثر دقة، ولكني لست متأكد من شكل العلاقة بينهم وكان الشرح بالتوريث لتوضيح ال methods والصفات الوسيطة بين الكائنات المكتلفة !!
شكراً لتعليقك
ما الفرق بين orm و pdo
بخصوص ال framworks زى ci هل افتراضيا يستخدم pdo ام يجب دمجه به ؟
ال PDO هي أختصار لـ PHP Data Object
وهي تتعامل مع مخزنات البيانات بأختلاف أنواعها مباشرتاً وليس بعد تمثيلها ككائنات وفئات class لها علاقات ببعضها البعض
PDO هي أستخدمها بدل أستخدام مكتبة mysql في php ولها مميزتها عند أستخدامها ولكنها تجعلني أتعامل مع قواعد البيانات مباشرتاً وأقوم أنا بعمل map للعلاقات في رأسي عند التعامل معها.
أما ORM كما وضحنا تصل بك انك لا تتعامل مع قواعد بيانات !! لا تكتب SQL !! فأنت تتعامل مع كائنات تحمل بيانات بكل بساطة .
للعلم فإن DocTrain تستخدم PDO للتعامل مع قواعد البيانات
درس ممتاز
جزاك الله خيرا
السلام عليكم ورحمة الله وبركاته
مقدمة جيدة يا حازم وإن كان لي بعض التعليق بخصوص ال ORM
مصطلح ال ORM والي هو إختصار ( object relational mapping)والي هي بدورها إختصار
object أتت من object oriented programming أو البرمجة الكائنية المتجهة والتي أصبحت أحد أهم ركائز لغات البرمجة الحديثة
أما relational فهي إختصار من relational databases أو قواعد البيانات العلائقة والي طبعا أحد سمات قواعد البيانات الحديثة أيضاً
وبكل بساطة عشان نفهم ال ORM بشكل أوسع
لو شوفنا أي خريطة هنلاقي إنها بتستخدم عشان توصلنا من مكان لمكان آخر أو من نقطة لنقطة آخرى
وبما إن لغات البرمجة تطورت وتقدمت وأصبح غالب العمل بيتم من خلال البرمجة المتجهة ومميزاتها وأصبح عندنا مصطلح إسمه كائن أو object والكائن دا ليه خصائصه وصفاته وأحداثه الخاصة بيه
بدأ فيه إتجاه نحو تحويل أي شيئ إلى كائن والتعامل معه على هذا الأساس وظهرت بعض التقنيات مثلPDO أو PHP Data Objects والي بتيح لينا وسيلة وصول لقواعد البيانات والتعامل معها بدون كتابة جمل ال sql
إذن أصبح لدينا
- لغة برمجة متجهه
- وسيلة تواصل برمجية تتخذ نفس أسلوب البرمجة الكائنية وتتيح لنا التعامل مع قواعد البيانات بدون كتابة جمل ال sql وتريح المبرمج من عناء معرفة الدريفرز او الانجنز الخاصة بقاعدة البيانات الي شغال عليها أو طريقة التصميم عليها
ولكن هل إكتفى التطور لهذا الحد ؟
بالطبع لا
من الوسيلتين السابقتين ظهرت الحاجة للتنسيق بينهم أو عمل عمليه mapping وبدأ فيه مصطلح جديد إسمه ORM أو ( object relational mapping)
والي بيعتبر خريطة الوصول ما بين الكود البرمجي وقاعدة البيانات والعكس
بمعنى أنه ال ORM لا يقتصر عمله فقط على تحويل الجداول إلى كائنات والتعامل معها على هذا الأساس
ولكن ال ORM ليه اتجاهين وطريقتين
1- الطريقة الأولى وهو Database-First بحيث ان المبرمج بيقوم بتعريف قاعدة البيانات الخاصة بيه وجداولها وحقولها( مثلا في ملف xml أو yml ) أولا ثم تقوم ال ORM بتوليد الكود المسئول عن التعامل مع هذه القاعدة والي بيضمنه المصطلح CRUD أو ( Create, read, update delete ) والي بتعبر عن العناصر الأساسية في التعامل مع قواعد البيانات ودي الي بيعرفها غالبية من عرف مصطلح ال ORM وكيفية إستخدامه
2- الطريقة الثانية وهي Code-First أو Model-First والتي يقوم فيها المبرمج بكتابة الكلاس الخاصة بيه على سبيل المثال كلاس إسمها User وبداخلها الأكواد الخاصة مع هذا الكائن ثم تقوم ال ORM بتوليد وتصميم قاعدة البيانات التي تتناسب مع هذا الكود
ودول سياستين مختلفتين في البرمجة
وطبعا مكتبات ال ORM كثيرة ومختلفه الأنواع والإستخدام وربما أشهرها LINQ بالنسبة لمبرمجي vs.net والمكتبتين doctrine,Propel بالنسبة لمبرمجي اللغات الأخرى وخاصة مبرمجي ال php
أتمنى أن يكون هناك إستفاده من ردي وأعتذر عن الإطاله
وإلى الأمام يا صديقي
شاكر جداً لك على ردك
شرحت ووضحت بطريقة أفضل بكثير مما كتبته أنا
جزاك الله خير
شرح رائع يا حازم وتكمله رائعه يا ابو الدهب بارك الله لكما