php - 使用 Eloquent 在 Laravel 中使用 where 子句访问嵌套的相关对象
问题描述
我正在尝试获取与特定客户端关联的任务列表,但任务与客户端之间没有直接关系。我还需要根据任务状态和项目状态过滤这些任务。
这是我的模型:
class Client extends Model
{
// Fields ['id']
public function projects()
{
return $this->hasMany('App\Project');
}
}
class Project extends Model
{
// Fields ['id', 'client_id', 'status']
public function client()
{
return $this->belongsTo('App\Client');
}
public function tasks()
{
return $this->hasMany('App\Task');
}
}
class Task extends Model
{
// Fields ['id', 'project_id', 'status']
public function project()
{
return $this->belongsTo('App\Project');
}
}
在我的控制器中,我可以直接访问Client $client
请求。
目标是返回一个任务列表,这些任务的状态为“打开”并且是客户拥有的项目的子项。
基本上,我想写这样的东西:
$client->projects->where('status', 'active')->tasks->where('status', 'open');
我想取回我从这个查询中得到的:
SELECT * FROM tasks AS t
WHERE t.status='open'
AND t.project_id IN (
SELECT id FROM projects AS p
WHERE p.status='active'
AND p.client_id=1
);
我已经能够使用 Laravel 的 Query Builder 解决它,但我想要一个直接使用 Eloquent 的 ORM 的解决方案。
DB::table('tasks')
->join('projects', function($join) use ($client) {
$join->on('projects.id', '=', 'tasks.project_id')
->where('projects.client_id', '=', $client->id);
})->select('tasks.*')->get();
这似乎是一个常见问题的变体,但我无法使用此处发布的其他答案来解决它。
相关问题:
解决方案
您正在寻找的是whereHas
. 它允许您查询“基于关系存在的结果”。
您可以尝试以下方法:
Task::where('status', 'open')
->whereHas('project', function ($query) use ($client) {
$query->where('client_id', $client->id)
->where('status', 'active');
})
->get();
hasManyThrough
也适用于这个结构:
// In Client.php
public function tasks()
{
return $this->hasManyThrough(Task::class, Project::class);
}
$client->tasks()
->where('projects.status', 'active')
->where('tasks.status', 'open')
->get();
但是不完全确定这是否可行。
推荐阅读
- javascript - 从最后一行谷歌应用程序脚本增加 ID
- excel - 在未锁定范围内动态锁定单元格
- python - 如何使用 Python 检查存储为 URL 的图像的图像透明度?
- java - 使用 jooq 从选择中排除提供的值
- elasticsearch - 启动 Elassandra - Cassandra 与 Elasticsearch 失败并没有配置 path.home
- php - PHP MYSQL:在当前搜索代码中加入关键字表
- java - 在 cmd 中运行基于 gradle 的 Java 应用程序时出现 ClassNotFoundException
- javascript - 使用 JavaScript 遍历表单以获取选定的多选、下拉和复选框项目
- elasticsearch - Elasticsearch - http 设置如何在 kubernetes 上设置
- java - Apache Camel 立即从 SQS 读取