HasMany глубокие отношения - PullRequest
       6

HasMany глубокие отношения

0 голосов
/ 28 марта 2019

У меня 5 моделей с одной сводной таблицей Country Province City Area Tour tour_location. Как добиться ниже функциональности?

$country->tours

$province->tours

$city->tours

$area->tours

Country.php Провинции HasMany

public function provinces()
{
    return $this->hasMany('App\Province', 'country_id', 'id');
}

Province.php HasMany Города

public function cities()
{
    return $this->hasMany('App\City', 'province_id', 'id');
}

City.php Области HasMany

public function areas()
{
    return $this->hasMany('App\Area', 'city_id', 'id');
}

Area.php Принадлежит к многим турам

public function tours()
{
    return $this->belongsToMany('App\Tour', 'tour_locations');
}

1 Ответ

1 голос
/ 28 марта 2019

Прямой способ - сделать это с join s, другой способ - создать пользовательские отношения, расширяющие hasManyThrough(). Третий параметр -imo- это использование пакета Eloquent-has-many-deep .

Используя этот пакет, вы можете сделать это:

class Country extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function tours()
    {
        return $this
          ->hasManyDeep('App\Tour', ['App\Province', 'App\City', 'App\Area', 'area_tour']);
    }
}

Тогда в вашем контроллере:

// ...
$country = Country::find(1);
$tours = $country->tours;

Отказ от ответственности: я никоим образом не участвую в этом пакете. Я просто предлагаю это, потому что это самый простой способ достичь желаемого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...