Как я могу получить всех соавторов, которые являются режиссерами в определенном фильме (Laravel + Eloquent)? - PullRequest
0 голосов
/ 15 марта 2019

У меня есть 3 таблицы: movies, movies_collaborators и movie_collaborator_types.

A movie может иметь много movie_collaborators, которые могут иметь много movie_collaborator_types.

Как определить и получить соавтора, который является Director для Movie для этого типа отношений?

Было бы легко, если бы это было простое отношение Many to Many, просто создать таблицу collaborator_movie с полями movie_id и collaborator_id, но в этом случае у меня в центре другой парень, collaborator_type и мне нужно получить и установить это отношение на основе этого поля.

Как я могу определить это отношение?

Obs: я думаю о создании таблицы collaborator_movie с movie_id и collaborator_id и collaborator_type_id. Но я застрял там, так как я впервые делаю Many to Many отношение с 3 fields на промежуточной таблице.

Ответы [ 2 ]

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

Вы можете ограничить свои результаты с помощью условия пивота:

/** YourController.php */

$title = 'Inception'; // example of movie title
$type = 1 // assuming id=1 is for a 'director' type

$colaborators = Movie::where('title', $title) // searching the movie
                    ->first() // getting the movie object
                    ->collaborators() // calling the relationship
                    ->wherePivot('collaborator_type_id', $type) // filtering <---
                    ->get(); // getting the results

Я сам не проверял, но это должно сработать. Проверьте документацию относительно этого аспекта.


PS: Если я не ошибаюсь, для того, чтобы это работало, в вашей модели отношений должен быть задан дополнительный столбец опорных точек:

/** Movie.php */

public function collaborators()
{
    return $this->belongsToMany(Collaborator::class)->withPivot('collaborator_type_id');
}
0 голосов
/ 15 марта 2019

Вы пробовали с HasManyThrough?

https://laravel.com/docs/5.8/eloquent-relationships#has-many-through

public function colaborators() { return $this->hasManyThrough('App\CollaboratorTypes', 'App\Collaborators'); } Тогда, может быть, вы можете использовать:

$colaborators = Movie::where('title', $title)->with('collaborators')->get();

...