LARAVEL أنواع العلاقات وطريقة الربط بين الجداول في لارافل

Database table
مكتبة  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
idname
1 رضوان
2 ابراهيم
1
2
3
4
5
6
7
class User extends Eloquent {
...
public function address(){
return $this->hasOne('Address');
}
...
}
addresses
iduser_idnamecountrycitystreet
11عنوان اقامة رضوانالمغربالراشديةواد الدهب
22عنوان اقامة ابراهيمالمغربالريشالمقاومة
1
2
3
4
5
6
7
class Address extends Eloquent {
...
public function user(){
return $this->belongsTo('User');
}
...
}

ONE TO MANY

وهي الأكثر استخداما، وتعني أن السجل الواحد في جدول البيانات الرئيسي يقابله أكثر من سجل في الجدول الآخر .
postes
idtitlecontent
1الموضوع اﻷولنص الموضوع
2الموضوع الثانينص الموضوع
1
2
3
4
5
6
7
class Post extends Eloquent {
...
public function comments(){
return $this->hasMany('Comment');
}
...
}
comments
idpost_idcomment
11التعليق ١ على الموضوع ١
21التعليق ٢ على الموضوع ١
32التعليق   ١على الموضوع ٢
42التعليق ٢ على الموضوع ٢
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_iduser_id
11
12
21
23
groups
idnamedescription
1مصمم مواقعانا مصمم مواقع
2مبرمج مواقع انا مبرمج موافع
3هاكرزانا مخرب مواقع
1
2
3
4
5
6
7
class Group extends Eloquent {
    ...
    public function users(){
        return $this->belongsToMany('User');
    }
    ...
}
users
idname
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 في جدول المستحدمين للمرور مباشرة الى كل التدوينات المنتمية الى دولة معينة.
users
idcountry_idname
11رصوان
22غالي
32ابراهيم
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
iduser_idtitlecontent
 11 الموضوع الاولنص الموضوع الاول
2 3 الموضوع التاني نص الموصوع الثاني
1
2
3
4
5
6
7
class Post extends Eloquent {
    ...
    public function user(){
        return $this->belongsTo('User');
    }
    ...
}
countries
idcountrycode
1MarocMA
2AustraliaAU
3FranceFR
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');
    }
    ...
}

شارك الموضوع

إقرأ أيضًا