2016-11-04 6 views
0

Der Zweck des eifrigen Ladens ist es, die Anzahl der DB-Abfragen zu reduzieren, wenn ich mich nicht irre. Aber wenn ich die folgenden meine Query Builder-Instanz hinzufügen, erzeugt es eine zusätzliche SQL-Abfrage für jeden Datensatz zurückgegeben:Eager loading funktioniert nicht

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

Es tut dies mit oder ohne Erklärung beizutreten.

So fehlt mir der Punkt des eifrigen Ladens, oder mache ich es falsch?

Mein zweites (wenig verwandtes) Problem ist, dass, wenn ich die kommentierte -> select() -Anweisung einschließe, diese Unterabfrage aus irgendeinem Grund keine Ergebnisse erzeugt.

In der Tat generiert Laravel die gleiche SQL-Abfrage für jeden Datensatz. Wenn es zwei Laptop Ergebnisse sind, erhalte ich zwei identische Abfragen der ersten Earmark Datensatz für jeden ziehen:

 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 

Diese Abfragen sind identisch!

Antwort

1

Es generiert mehrere Abfragen wegen Ihrer get() am Ende der Unterabfrage, die es ausführt. Sie führen keine Unterabfragen in Laravel aus, da sie ausgeführt werden, nachdem die erste Abfrage ausgeführt wurde, um die Beziehungen anzuhängen. Ersetzen Sie das mit take(1) und wit löst Ihr N + 1 Problem.

Verwandte Themen