روابط Has Many Through در لاراول

علی شریفی نیستانی

می 12, 2018

در Eloquent ، یکی از روابط میان جدول های دیتابیس، رابطه ی Has Many Through است. در این آموزش سعی میکنم از طریق یک مثال این رابطه رو به شما یاد بدم. بهترین ترجمه ای که برای این رابطه به نظرم میرسه “رابطه به واسطه ی رابطه دیگر” هستش. فرض کنید ما دارای جدول های استان ها، شهر ها و کاربران هستیم. که در طراحی مدل های ما هر کاربر( User) متعلق به یک شهر(City) و هر شهر متعلق به یک استان(State) است.

حالا قصد داریم تمام کاربرانی که متعلق به یک استان هستند را نشان دهیم. برای رسیدن به این منظور Eloquent یک رابطه با نام Has Many Through در اختیار ما گذاشته تا بتوانیم در مدل State به واسطه ی مدل City کاربران را نشان دهیم. اگرچه در جدول users ستونی به نام state_id وجود ندارد، با این حال رابطه ی hasManyThrough امکان دسترسی به کاربران یک استان را به واسطه ی رابطه ی میان شهر و کاربران در اختیار ما قرار می دهد. ( $states->users ) برای اینکار کافی است تا در مدل State یک متد به نام users قرار دهید که مقدار زیر را بر می گرداند:

$this->hasManyThrough('App\User', 'App\City'); 1 $this->hasManyThrough('App\User', 'App\City');

به کد زیر توجه کنید:

<?php

class State extends Model
{
    public function users()
    {
        return $this->hasManyThrough('App\User', 'App\City');
    }

}

متد hasManyThrough دو آرگومان اصلی میگیرد. در آرگومان اول نام مدل مورد نظر User و در آرگومان دوم نام مدل واسط City را وارد می کنیم. نکته: اگر برای کلید های خارجی جدول خود نام “تخیلی” انتخاب کرده اید (نام گذاری فیلد به صورتی باشد که Eloquent انتظار آن را ندارد) باید نام کلید های خارجی را هم در آرگومان های بعدی وارد نمایید. به مثال زیر توجه کنید:

<?php

class States extends Model
{
    /**
     * created by http://afracode.com
     */
    public function users()
    {
        return $this->hasManyThrough(
            'App\User',
            'App\City',
            'kelide_city_be_state', // (state_id) Foreign key on cities table... 
            'kelide_karbar_be_city', // (city_id) Foreign key on users table... 
            'id', // Local key on states table..
            'id' // Local key on cities table...
        );
    }
}