В документации Eloquent сказано, что я могу передать ключи желаемого отношения к hasManyThrough .
Допустим, у меня есть модели с именем Country, User, Post. Модель страны может иметь много сообщений через модель пользователей. Я сказал, что просто позвоню:
$this->hasManyThrough('Post', 'User', 'country_id', 'user_id');
Это прекрасно! Но как я могу получить эти сообщения только для пользователя с идентификатором 3?
Может ли кто-нибудь помочь здесь?
Итак, вот оно:
модели: в Country
много User
которых много Post
Это позволяет нам использовать hasManyThrough
как в вашем вопросе:
// Country model public function posts() { return $this->hasManyThrough('Post', 'User', 'country_id', 'user_id'); }
Вы хотите получить сообщения данного пользователя для этого отношения, так что:
$country = Country::first(); $country->load(['posts' => function ($q) { $q->where('user_id', '=', 3); }]); // or $country->load(['posts' => function ($q) { $q->has('user', function ($q) { $q->where('users.id', '=', 3); }); }) $country->posts; // collection of posts related to user with id 3
НО это будет проще, более читабельным и более красноречивым, если вы используете это вместо этого: (поскольку он не имеет ничего общего с страной, когда вы ищете сообщения пользователя с идентификатором 3)
// User model public function posts() { return $this->hasMany('Post'); } // then $user = User::find(3); // lazy load $user->load('posts'); // or use dynamic property $user->posts; // it will load the posts automatically // or eager load $user = User::with('posts')->find(3); $user->posts; // collection of posts for given user
Подводя итог: hasManyThrough
– это способ напрямую вложить вложенные отношения, т. hasManyThrough
все должности для данной страны, а не поиск конкретной модели.
$user_id = 3; $country = Country::find($country_id); $country->posts()->where('users.id', '=', $user_id)->get();