多层次关系 whereHas on eloquent Model in Laravel

sti*_*edo 3 laravel eloquent laravel-5 laravel-5.6

我想找到 Project::with('tasks.tags')->get();

其中只有具有特定 id 标记的项目在结果集中返回。

例如。我想找到一个带有任务和标签的任务的项目,其中标签的 ID 仅为 1。换句话说,过滤项目 - 任务关系内的任务返回。

我尝试了各种方法,但到目前为止都失败了。

我试过了:

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

和:

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

这是建立关系的方式:

在 Project.php 中

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

在 Task.php 中

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

}
Run Code Online (Sandbox Code Playgroud)

注意Task和Tags之间的关系是morphToMany。

任何指针?

Rwd*_*Rwd 5

您还需要确定急切加载的范围。像下面这样的东西应该工作:

$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();
Run Code Online (Sandbox Code Playgroud)


sti*_*edo 5

在这里找到了答案。

Project::with(['tasks' => function($q) {
            $q->whereHas('tags', function($query) {
                $query->where('tag_id', 1);
            });
}])->get();
Run Code Online (Sandbox Code Playgroud)