2016-11-04 3 views
0

Целью активной загрузки является уменьшение количества запросов БД, если я не ошибаюсь. Но если добавить следующее к моему примеру построитель запросов, он создает дополнительный SQL запрос для каждой записи возвращается:Нежелательная загрузка не работает

 ->with([ 
      'firstEarmark' => function($q) { 
       $q 
       ->select('earmarks.*') 
       ->join('locations', 'locations.id', '=', 'earmarks.location') 
       ->select('earmarks.*', 'locations.location AS earmarked_location') 
       ->where('date', '>=', date('m/d/Y'))->orderBy('date', 'asc') 
       ->get(); 
      } 

Он делает это с или без присоединиться к заявлению.

Так что я пропущу точку нетерпения, или я делаю это неправильно?

Моя вторая (слегка несвязанная) проблема заключается в том, что если я включаю комментарий commented -> select(), этот подзапрос не дает результатов по какой-либо причине.

Фактически, Laravel генерирует один и тот же SQL-запрос для каждой записи. Если есть два результата для ноутбука, я получаю два одинаковых запросов, чтобы вытащить первую запись Earmark для каждого:

 113 Prepare select `earmarks`.*, `locations`.`location` as `earmarked_location` from `earmarks` inner join `locations` on `locations`.`id` = `earmarks`.`location` where `earmarks`.`laptop_id` in (?, ?) and `date` >= ? order by `date` asc 
     113 Execute select `earmarks`.*, `locations`.`location` as `earmarked_location` from `earmarks` inner join `locations` on `locations`.`id` = `earmarks`.`location` where `earmarks`.`laptop_id` in (1, 2) and `date` >= '11/04/2016' order by `date` asc 
     113 Close stmt  
     113 Prepare select `earmarks`.*, `locations`.`location` as `earmarked_location` from `earmarks` inner join `locations` on `locations`.`id` = `earmarks`.`location` where `earmarks`.`laptop_id` in (?, ?) and `date` >= ? order by `date` asc 
     113 Execute select `earmarks`.*, `locations`.`location` as `earmarked_location` from `earmarks` inner join `locations` on `locations`.`id` = `earmarks`.`location` where `earmarks`.`laptop_id` in (1, 2) and `date` >= '11/04/2016' order by `date` asc 

Эти запросы идентичны!

ответ

1

Он генерирует несколько запросов из-за вашего get() в конце подзапроса, который его выполняет. Вы не выполняете подзапросы в Laravel, поскольку они будут выполняться после запуска первого запроса для присоединения отношений. Замените это на take(1), и остроумие решит вашу проблему с N + 1.

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