2015-12-16 6 views
1

Я использую красноречие laravel для запроса нескольких таблиц в базе данных. Выполняется следующий запрос. Однако я хочу добавить что-то к запросу, который будет отфильтровывать milestones в зависимости от того, установлено ли значение Job столбец таблицы archived равным 0 или 1.Laravel Eloquent Joining Strange query

$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

Если вы собираетесь фильтровать эту часть, '-> с ('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 пример только получить Milestone с заданием, который имеет архивное значение 0.

Относно комментарий выше по @Tezla, я не думаю, ограничение требуемых нагрузок - это то, что вы хотите, потому что оно все равно получит вам Milestone, который не соответствует требованию. Скорее, он просто вернет пустую коллекцию Job для отношений.

+0

Хммм, это запускает запрос в другом месте, поэтому на самом деле это не делает то же самое, так как я испытываю наибольшую трудность, используя две таблицы Milestone и Job, а затем используя столбец «archived» – 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() 
    )); 
});