我正在使用laravel的口才来查询数据库中的多个表。以下查询正在运行。但是,我想在查询中添加一些内容,根据milestones
表格列Job
的值是archived
还是{{1}来过滤0
}}。
1
我一直试图按照以下各项做点:
$app->get('/dashboard/user', function() {
global $app;
$milestones = Milestone::where('user_id', '=', $app->user->user_id)
->where('completed_flag', '=', '0')
->with('job.businessUnit')
->with('user')
->orderBy('deadline', 'asc')
->get();
$milestones = $milestones->sort(function($a, $b) {
$a0 = ($a->milestone_id == $a->job->next_incomplete_milestone_id);
$b0 = ($b->milestone_id == $b->job->next_incomplete_milestone_id);
return ( ($a0 == $b0) ? strcmp($a->deadline, $b->deadline) :
(($a0 == true) ? -1 : 1));
});
print json_encode(array(
'user' => $app->user->toArray(),
'milestones' => $milestones->toArray()
));
});
答案 0 :(得分:1)
您正在寻找的是whereHas
方法。
例如:
$milestones = Milestone::whereHas('job', function($query) {
$query->where('archived','=','0');
})
... // took out rest of code for brevity
->get();
此whereHas
示例仅检索具有归档值0的作业的里程碑。
关于@Tezla上面提到的评论,我不认为限制急切负载是你想要的,因为它仍然会让你的里程碑不符合要求。相反,它只会为关系返回一个空的Job集合。
答案 1 :(得分:0)
原来我必须做一些能够反映以下SQL
查询的内容
SELECT * FROM milestones JOIN jobs ON milestones.job_id = jobs.job_id WHERE milestones.user_id = 2 AND milestones.completed_flag = 0 AND jobs.archived = 0;
在职位和里程碑上有INNER JOIN
。
$app->get('/dashboard/user', function() {
global $app;
$milestones = Milestone::where('user_id', '=', $app->user->user_id)
->join('jobs', 'jobs.job_id', '=', 'milestones.job_id')
->where('jobs.archived', '=', '0')
->where('completed_flag', '=', '0')
->with('job.businessUnit')
->with('user')
->orderBy('deadline', 'asc')
->get();
$milestones = $milestones->sort(function($a, $b) {
$a0 = ($a->milestone_id == $a->job->next_incomplete_milestone_id);
$b0 = ($b->milestone_id == $b->job->next_incomplete_milestone_id);
return ( ($a0 == $b0) ? strcmp($a->deadline, $b->deadline) :
(($a0 == true) ? -1 : 1));
});
$milestones = $milestones->values();
print json_encode(array(
'user' => $app->user->toArray(),
'milestones' => $milestones->toArray()
));
});