Php Laravel雄辩地加入奇怪的查询

Php Laravel雄辩地加入奇怪的查询,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我使用laravel的Elount来查询数据库中的多个表。以下查询正在运行。但是,我想向查询中添加一些内容,根据Jobtable columnarchived的值是否设置为0或1来过滤出里程碑 $app->get('/dashboard/user', function() { global $app; $milestones = Milestone::where('user_id', '=', $app->user->user_id) ->

我使用laravel的Elount来查询数据库中的多个表。以下查询正在运行。但是,我想向查询中添加一些内容,根据
Job
table column
archived
的值是否设置为
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()
    ));
});
我一直在尝试做以下每一项:

    ->join('jobs','jobs.archived','=','0')
//
    ->where('archived','=','0')
//  
    ->with('jobs.archived')
//
    ->with('jobs')
//
    ->where('jobs.archived', '=', '0')

你要找的是方法

例如:

$milestones = Milestone::whereHas('job', function($query) {
    $query->where('archived','=','0');
})
... // took out rest of code for brevity
->get();
whereHas
示例将仅检索存档值为0的作业的里程碑


关于@Tezla提到的上述评论,我不认为约束急切的负载是你想要的,因为它仍然会让你获得不符合要求的里程碑。相反,它只会为关系返回一个空的作业集合。

结果表明,我必须做一些事情来镜像下面的
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; 
在作业和里程碑上有一个
内部联接

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

如果要筛选此部分,请使用('job.businessUnit')
。您可以使用.Hmmm,这会在不同的位置启动查询,因此它实际上并不是在做相同的事情,因为我最难使用两个表Milestone和Job,然后使用Job列
archived