2015-12-16 28 views
1

我正在使用laravel的雄辯爲了查詢數據庫中的多個表。以下查詢正在工作。但是,我想在查詢中添加一些內容,根據Job表列archived的值是否設置爲01來過濾掉milestonesLaravel雄辯的加入奇怪的查詢

$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') 
+0

如果您打算過濾此部分' - > with('job.businessUnit')'。你可以使用[eagerLoad約束](http://laravel.com/docs/5.1/eloquent-relationships#constraining-eager-loads)。 –

回答

1

你要找的是whereHas方法。

例如:

$milestones = Milestone::whereHas('job', function($query) { 
    $query->where('archived','=','0'); 
}) 
... // took out rest of code for brevity 
->get(); 

whereHas例如將只與具有0

歸檔值關於通過上面提到@Tezla評論作業檢索里程碑,我不認爲限制急切的負載是你想要的,因爲它仍然會讓你的里程碑不符合要求。相反,它只會爲關係返回一個空的Job集合。

+0

嗯,這開始查詢在不同的地方,所以它不是真的做同樣的事情,因爲我使用兩個表裏程碑和工作,然後使用作業列'存檔'最困難 – maudulus

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