首页 > 解决方案 > 多级关系 whereHas on eloquent Model in Laravel

问题描述

我想找到 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();

和:

$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([]);
}

在 Task.php 中

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

}

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

任何指针?

标签: laravellaravel-5eloquentlaravel-5.6

解决方案


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

$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();

推荐阅读