مكتبة Eloquent ORM هي مكتبة خاصة للتعامل مع قواعد البيانات بسيطة الإستخدام وتمتلك العديد من المميزات تعتمد فكرتها على بناء Model لكل جدول في قاعدة البيانات , كمتال على ذالك لدينا جدول users يحتوي على الاعضاء المشتركين في الموقع , نقوم بانشاء Model User :
1
| class User extends Eloquent {} |
هدا كل ما نحتاجه للتعامل مع جدول users بالطريقة التالية :
01
02
03
04
05
06
07
08
09
10
11
| // جلب كل الاعضاء المسجلين $users = User::all(); // جلب العضو رقم الايدي 1 $user = User::find(1); // اضافة عضو جديد $user = User::create( array ( 'name' => 'رضوان' )); // جلب العضو رضوان او اضافة عضو جديد بنفس الاسم ادا لم يكن موجودا $user = User::firstOrCreate( array ( 'name' => 'رضوان' )); |
أنواع العلاقات :
يمكن ربط جدولين إذا كان كليهما يشتمل على حقل أو أكثر لهما نفس البيانات، وعادة تسمى الحقول في كلا الجدولين بنفس الاسم. علاقة one-to-many علاقة one-to-one علاقة many-to-many Has Many Through Polymorphic One to Many Polymorphic Many to Many
ONE TO ONE
كل سجل في الجدول الرئيسي يقابله سجل واحد في الجدول المرتبط به.
users
id | name |
1 | رضوان |
2 | ابراهيم |
1
2
3
4
5
6
7
| class User extends Eloquent { ... public function address(){ return $this ->hasOne( 'Address' ); } ... } |
addresses
id | user_id | name | country | city | street |
1 | 1 | عنوان اقامة رضوان | المغرب | الراشدية | واد الدهب |
2 | 2 | عنوان اقامة ابراهيم | المغرب | الريش | المقاومة |
1
2
3
4
5
6
7
| class Address extends Eloquent { ... public function user(){ return $this ->belongsTo( 'User' ); } ... } |
ONE TO MANY
وهي الأكثر استخداما، وتعني أن السجل الواحد في جدول البيانات الرئيسي يقابله أكثر من سجل في الجدول الآخر .
postes
id | title | content |
1 | الموضوع اﻷول | نص الموضوع |
2 | الموضوع الثاني | نص الموضوع |
1
2
3
4
5
6
7
| class Post extends Eloquent { ... public function comments(){ return $this ->hasMany( 'Comment' ); } ... } |
comments
id | post_id | comment |
1 | 1 | التعليق ١ على الموضوع ١ |
2 | 1 | التعليق ٢ على الموضوع ١ |
3 | 2 | التعليق ١على الموضوع ٢ |
4 | 2 | التعليق ٢ على الموضوع ٢ |
1
2
3
4
5
6
7
| class Comment extends Eloquent { ... public function post(){ return $this ->belongsTo( 'Post' ); } ... } |
MANY TO MANY
عدة سجلات من الجدول الاول مرتبطة بعدة سجلات من الجدول الثانى وهي علاقة الوهمية اى انها لاتحدث بمفردها يجب اخداث جدول بين هذا الجدولين يعرف هذا الجدول بالجدول الوسيط فتتحول علاقة Many To Many الى علاقتين من نوع belongsToMany
BelongsToMany
group_id | user_id |
1 | 1 |
1 | 2 |
2 | 1 |
2 | 3 |
groups
id | name | description |
1 | مصمم مواقع | انا مصمم مواقع |
2 | مبرمج مواقع | انا مبرمج موافع |
3 | هاكرز | انا مخرب مواقع |
1
2
3
4
5
6
7
| class Group extends Eloquent { ... public function users(){ return $this ->belongsToMany( 'User' ); } ... } |
users
id | name |
1 | ابراهيم |
2 | رضوان |
3 | سعيد |
1
2
3
4
5
6
7
| class User extends Eloquent { ... public function groups(){ return $this ->belongsToMany( 'Group' ); } ... } |
HASMANYTHROUGH
علاقة HasManyThrough ليست علاقة خقيقية ,هي طريقة للوصول الى جداول مترابطة بكيفية غير مباشرة .
مثال على دالك
لدينا مستخدم ينتمي الى بلد معين و كل بلد يمكن ان ياتي منه مستخدمون كثر من جهة اخرى كل مستخدم يمكن ان ينشر العديد من التدوينات. المشكلة الان هي كيف يمكننا الحصول على جميع التدوينات خسب البلد
عادة نستعمل الطريقة التالية
1
2
3
4
5
6
7
8
| //with solves the n+1 issue (http://goo.gl/aQwpQf). $country = Country::with([ 'user' , 'user.post' ])->where( 'code' , 'NZ' )->get(); $posts = []; $country ->users->each( function ( $user ) use ( $posts ){ $posts = array_merge ( $posts , $user ->posts); }); //$posts now contains all posts from NZ |
اسطر لا باس بها من الكود علاقة has many through تمكننا من الاستغناء عن كل هدا .
كما لاصتم من قبل جدول التدوينات ليس له علافة مع جدول الدول لكن يمكننا استعمال country_id في جدول المستحدمين للمرور مباشرة الى كل التدوينات المنتمية الى دولة معينة.
كما لاصتم من قبل جدول التدوينات ليس له علافة مع جدول الدول لكن يمكننا استعمال country_id في جدول المستحدمين للمرور مباشرة الى كل التدوينات المنتمية الى دولة معينة.
users
id | country_id | name |
1 | 1 | رصوان |
2 | 2 | غالي |
3 | 2 | ابراهيم |
01
02
03
04
05
06
07
08
09
10
11
| class User extends Eloquent { ... public function country(){ return $this ->belongsTo( 'Country' ); } public function posts(){ return $this ->hasMany( 'posts' ); } ... } |
posts
id | user_id | title | content |
1 | 1 | الموضوع الاول | نص الموضوع الاول |
2 | 3 | الموضوع التاني | نص الموصوع الثاني |
1
2
3
4
5
6
7
| class Post extends Eloquent { ... public function user(){ return $this ->belongsTo( 'User' ); } ... } |
countries
id | country | code |
1 | Maroc | MA |
2 | Australia | AU |
3 | France | FR |
01
02
03
04
05
06
07
08
09
10
11
| class Country extends Eloquent { ... public function users(){ return $this ->hasMany( 'User' ); } public function posts(){ return $this ->hasManyThrough( 'Post' , 'User' ); } ... } |