Laravel Eloquent加入奇怪的查询

时间:2015-12-16 23:13:40

标签: php mysql laravel eloquent

我正在使用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()
    ));
});

2 个答案:

答案 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()
    ));
});