2015-03-02 3 views
1

У меня есть код, который работает, но без желания загружать вложенные отношения.Laravel нетерпеливо загружает вложенные отношения с пользовательским запросом

$projects = Project::with('organization') 
     ->leftJoin('stages', 'stages.project_id', '=', 'projects.id') 
     ->leftJoin('activities', 'activities.stage_id', '=', 'stages.id') 
     ->leftJoin('tasks', 'tasks.activity_id', '=', 'activities.id') 
     ->select('projects.*', DB::raw('SUM(IF(tasks.status = 4, score, 0)) AS score'), 
           DB::raw('SUM(tasks.score) AS total_score')) 
     ->groupBy('projects.id') 
     ->get(); 

Я хочу сделать это с жадной загрузкой вложенных отношений, и если я не буду иметь эти пользовательские выбирает (total_score и оценка), я бы

$projects = Project::with('stages.activities.tasks'); 

, но на тех, кто появляется проблема пользовательский выбор (оценка и total_score). я пытался что-то подобное, но не работает

$projects = Project::with(['stages', 'activities', 'tasks' => function($q) { 
     $q->select(DB::raw('SUM(IF(tasks.status = 4, score, 0)) AS score'), 
        DB::raw('SUM(tasks.score) AS total_score')); 
    }])->get(); 
+0

Как бы SQL это идеально выглядело? Если я правильно понимаю ваш вопрос, может быть более эффективным сделать это как 2 запроса – rpgFANATIC

ответ

4

Что-то подобное должно работает.

$projects = $project::with(array('stages' => function($q) 
{ 
    $q->with(array('activities' => function($q) 
    { 
    $q->with(array('tasks' => function($q) 
    { 
     $q->groupBy('tasks.id'); 
     $q->addselect([ 
      DB::raw('SUM(IF(tasks.status = 4, score, 0)) AS score'), 
      DB::raw('SUM(tasks.score) AS total_score') 
      ]); 
     })); 
    })); 
    })) 
->get(); 

Если вам нужно больше аргументов для вашей функции function($q) use ($arg).

Смежные вопросы