بخش سوم - روابط - قسمت پنجم
رابطه Has-Many-Through و Has-One-Through
رابطه Has-Many-Through زمانی استفاده میشود که یک مدل بتواند از طریق یک مدل واسط (Intermediate Model) به چندین رکورد در یک مدل دیگر دسترسی پیدا کند. به عبارت دیگر، این رابطه به شما اجازه میدهد که یک مدل با یک مدل دورتر (که مستقیماً به آن مرتبط نیست) ارتباط داشته باشد و بتوانید از طریق یک مدل واسط، رکوردهای آن را بازیابی کنید.
مثال:
فرض کنید شما سه جدول دارید:
1- جدول کشورها.
2- جدول کاربران که هر کاربر متعلق به یک کشور است.
3- جدول پستها که هر پست توسط یک کاربر نوشته شده است.
اگر بخواهید همه پستهایی که در یک کشور خاص نوشته شدهاند را پیدا کنید، این کار را از طریق رابطه Has-Many-Through انجام میدهید.
1- ساختار جداول:
جدول countries اطلاعات کشورها را نگهداری میکند. این جدول دارای یک فیلد id به عنوان primary key است.
جدول users اطلاعات کاربران را نگهداری میکند. این جدول دارای یک فیلد id به عنوان primary key و یک کلید خارجی (country_id) است که به جدول countries اشاره دارد.
جدول posts اطلاعات پستهای نوشته شده توسط کاربران را نگهداری میکند. این جدول دارای یک فیلد id به عنوان primary key و یک کلید خارجی (user_id) است که به جدول users اشاره دارد.
2- تعریف رابطه:
ابتدا با دو متد جدید برای ایجاد روابط آشنا می شویم:
1- متد hasOneThrough
زمانی استفاده میشود که یک رکورد از یک مدل از طریق یک مدل واسط، تنها به یک رکورد از مدل دیگری مرتبط باشد.
public function relatedModel()
{
return $this->hasOneThrough(FinalModel::class, IntermediateModel::class);
}
پارامترها:
1- نام مدل نهایی که قصد دارید به آن دسترسی داشته باشید.
2- نام مدل واسط که بین مدل اصلی و مدل نهایی قرار دارد.
3- نام ستون کلید خارجی در مدل واسط که به مدل اصلی (جایی که رابطه را تعریف میکنید) اشاره میکند.(اختیاری)
4- نام ستون کلید خارجی در مدل نهایی که به مدل واسط اشاره میکند.(اختیاری)
5- نام ستون کلید محلی در مدل اصلی. بهطور پیشفرض از id استفاده میشود.(اختیاری)
6- نام ستون کلید محلی در مدل واسط. بهطور پیشفرض از id استفاده میشود.(اختیاری)
2- متد hasManyThrough
برای دسترسی به چندین رکورد از یک مدل از طریق یک مدل واسط استفاده میشود. این متد معمولاً در مواقعی استفاده میشود که یک مدل بتواند از طریق یک مدل واسط به چندین رکورد در یک مدل دیگر دسترسی داشته باشد.
سینتکس و پارامتر ها مشابه hasOneThrough می باشد.
———
در این مثال، کشورها (Country) از طریق کاربران (User) به پستها (Post) مرتبط هستند. بنابراین، یک کشور میتواند از طریق کاربران خود به چندین پست دسترسی داشته باشد.
مدل Country:
این مدل از طریق کاربران به پستها دسترسی پیدا میکند. رابطه Has-Many-Through در این مدل تعریف میشود.
public function posts()
{
return $this->hasManyThrough(Post::class, User::class, 'country_id', 'user_id');
}
مدل User:
رابطهای مستقیم بین کاربران و پستها وجود دارد. این مدل برای ارتباط میان کشورها و پستها استفاده میشود.
public function country()
{
return $this->belongsTo(Country::class);
}
public function posts()
{
return $this->hasMany(Post::class);
}
مدل Post:
هر پست متعلق به یک کاربر است.
public function user()
{
return $this->belongsTo(User::class);
}
3- استفاده از رابطه:
حال اگر بخواهید تمام پستهای نوشتهشده در یک کشور خاص (مثلاً "USA") را پیدا کنید:
$country = Country::find(1); // USA
$posts = $country->posts;
در این مثال، کشور "USA" از طریق کاربران خود به تمام پستهایی که کاربرانش نوشتهاند، دسترسی پیدا میکند.
———
روابط Has-Many-Through و Has-One-Through در ساختار جداول و مدل ها کاملا یکسان هستند، جز تفاوت در استفاده از متد های hasManyThrough یا hasOneThrough بسته به نوع رابطه.
تفاوت در عمل نیز به این صورت است که Has-One-Through برای زمانی استفاده میشود که میخواهیم از طریق یک مدل واسط به یک رکورد از مدل نهایی دسترسی پیدا کنیم، در صورتی که Has-Many-Through برای زمانی است که میخواهیم از طریق یک مدل واسط به چندین رکورد از مدل نهایی دسترسی داشته باشیم.
به طور کلی انتظار داریم از Has-One-Through فقط یک رکورد دریافت کنیم، در حالی که از Has-Many-Through ممکن است چندین رکورد دریافت کنیم.
▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.