Многоуровневые отношения, где есть красноречивая модель в Laravel - PullRequest
0 голосов
/ 30 июня 2018

Я бы хотел найти Project::with('tasks.tags')->get();

, где только проекты с определенным идентификатором тега возвращаются в наборе результатов.

Например Я хотел бы найти проект с задачами и задачами с тегами только с идентификатором 1. Другими словами, отфильтруйте задачи, возвращаемые внутри отношения Проект - Задача.

Я пробовал разные способы, но до сих пор не получилось.

Я пробовал:

$project = Project::with('tasks.tags')->whereHas('tasks', function($query){
            $query->whereHas('tags', function($query) {
                $query->where('id', 1);
            });
})->get();

И

$project = Project::with('tasks.tags')->whereHas('tasks', function($query){
            $query->whereHas('tags', function($query) {
                $query->where('tag_id', 1);
            });
})->get();

Вот как устанавливаются отношения:

В Project.php

public function tasks()
{
    return $this->hasMany(Task::class, 'project_id')->setEagerLoads([]);
}

In Task.php

public function tags()
{
        return $this->morphToMany(Tag::class, 'taggable')->setEagerLoads([]);

}

Обратите внимание, что связь между Task и Tags принадлежит morphToMany.

Есть указатели?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Нашел ответ здесь.

Project::with(['tasks' => function($q) {
            $q->whereHas('tags', function($query) {
                $query->where('tag_id', 1);
            });
}])->get();
0 голосов
/ 30 июня 2018

Вы должны также охватить энергичную загрузку. Должно работать что-то вроде следующего:

$project = Project::with(['tasks.tags' => function ($query) {
    $query->where('id', 1);
}])->whereHas('tasks', function ($query) {
    $query->whereHas('tags', function ($query) {
        $query->where('id', 1);
    });
})->get();
...