laravel - 多级关系 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。
任何指针?
解决方案
您还需要确定急切加载的范围。像下面这样的东西应该可以工作:
$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();
推荐阅读
- bash - 如何使用bash替换csv文件中特定位置的字符串
- html - 浮动向右移动下一行
- html - 使用百分比作为网格间隙时 CSS 网格高度错误
- powershell - 使用 .Lnk 文件到 Powershell 的恶意软件
- c - 释放不相关数据时的段错误
- python - 使用 pyenv 安装的 python 导入时找不到“_sqlite3”模块
- java - 这是将字节转换为 GB 的权利吗?
- rx-java - 如何用之前/之后的行为组成一个 Observable
- swift - displayLink - 编译器永远修复我
- xml - 修改整个 XML 属性,然后将所有结果合并到一个 XML 中