- Отношение hasMany(through)
Ко многим через
Связь «ко многим через» обеспечивает удобный короткий путь для доступа к удалённым отношениям через промежуточные. Например, модель Country может иметь много Post через модель User. В данном примере вы можете просто собрать все статьи для заданной country. Таблицы для этих отношений будут выглядеть так:
countries
id - integer
name - string
users
id - integer
country_id - integer
name - string
posts
id - integer
user_id - integer
title - string
Несмотря на то, что таблица posts не содержит столбца country_id, отношение «ко многим через» позволит нам получить доступ к posts через country с помощью $country
->
posts
. Для выполнения этого запроса Eloquent ищет country_id в промежуточной таблице users. После нахождения совпадающих ID пользователей они используются в запросе к таблице posts.
Теперь, когда мы рассмотрели структуру таблицы для отношений, давайте определим отношения для модели Country:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Country extends Model { /** * Получить все статьи по заданной области. */ public function posts() { return $this->hasManyThrough('App\Post', 'App\User'); } }
Первый параметр, переданный в метод hasManyThrough
()
является именем конечной модели, которую мы получаем, а второй параметр — это имя промежуточной модели.
The third argument is the name of the foreign key on the intermediate model, the fourth argument is the name of the foreign key on the final model.
The third argument is the name of the foreign key on the intermediate model, the fourth argument is the name of the foreign key on the final model, and the fifth argument is the local key:
Обычные соглашения для внешнего ключа Eloquent будут использоваться при выполнении запросов отношения. Если вы хотите настроить ключи отношения, вы можете передать их третьим и четвертым параметрами методу hasManyThrough
()
. Третий параметр — имя внешнего ключа для промежуточной модели, четвертый параметр — имя внешнего ключа для конечной модели, а пятый аргумент (для версии 5.2 и выше) — локальный ключ:
class Country extends Model { public function posts() { return $this->hasManyThrough( 'App\Post', 'App\User', 'country_id', 'user_id', 'id' ); //для версии 5.1: //return $this->hasManyThrough('App\Post', 'App\User', 'country_id', 'user_id'); } }