【发布时间】:2020-05-29 13:44:12
【问题描述】:
我正在尝试获取与特定客户端关联的任务列表,但任务与客户端之间没有直接关系。我还需要根据任务状态和项目状态过滤这些任务。
这是我的模型:
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 的查询生成器解决它,但我想要一个直接使用 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();
这似乎是一个常见问题的变体,但我无法使用此处发布的其他答案来解决它。
相关问题:
laravel orm : where condition on table -> related table -> related table
【问题讨论】:
标签: php laravel eloquent eloquent-relationship