2016-04-03 14 views
3

Ich habe ein Problem mit meiner Abfrage in Laravel eloquent, ich bekomme keine Ergebnisse, wenn ich die Abfrage ausführen und die generierte Abfrage scheint nicht das zu sein, was ich erwarte. Erweiterte Where-Klausel in Laravel

Dies ist der Code in der Steuerung:

$lastUpdate = Input::get('last_update'); 
$userId = Auth::user()->id; 

$eventIds = EventVendor::where('user_id', $userId) 
        ->where('is_active', 1)->get()->lists('event_id'); 

$events = EventDetails::whereIn('id', $eventIds) 
        ->where(function($query) use ($lastUpdate) { 
         $query->where('created_at', $lastUpdate); 
         $query->orWhere('updated_at', $lastUpdate); 
        }) 
        ->where('is_active', 1) 
        ->with("details_sub") 
        ->with("extras") 
        ->with("chargesDiscounts") 
        ->toSql(); 

Dies ist die Abfrage, die erzeugt wird:

select * from `mtgh_event_details` 
    where `mtgh_event_details`.`deleted_at` is null 
     and 0 = 1 
     and (`created_at` = ? or `updated_at` = ?) 
     and `is_active` = ? 

Neben dem 0 = 1 die angeblich nicht da sein Ich sehe nicht, die vollständige Abfrage entweder.

+0

Wird die '0 = 1' tatsächlich in Ihrer Abfrage angezeigt, oder ist das etwas, das Sie für die Frage geändert haben? – patricus

+0

Es zeigt sich in meiner Abfrage. – user3718908

Antwort

1

Also ich das Problem gefunden, offenbar diesen Teil der Abfrage

$eventIds = EventVendor::where('user_id', $userId) 
        ->where('is_active', 1)->get()->lists('event_id'); 

War Rückkehr null oder eine leere Liste, daher der 0 = 1 in meiner Anfrage. Auch mit Hilfe der anderen Antwort konnte ich meinen Code etwas vereinfachen, danke. :)

3

Die 0 = 1 wird angezeigt, weil die Abfrage zum Auffüllen Ihrer $eventIds keine Ergebnisse zurückgibt, so dass Ihre Collection leer ist. Wenn Sie ein leeres Array (oder Collection) an whereIn() übergeben, wird die Abfrage durch Hinzufügen von 0 = 1 gekürzt, da die Suche nach ungültigen SQL ist und die logische Suche in einem leeren Set immer keine Ergebnisse liefert. Diese Verknüpfung wurde in 4.2.17 mit this pull request hinzugefügt.

Wie für den Rest der Abfrage, alles sieht normal für mich. Die Anweisungen with() richten das Eager-Laden ein, das separate SQL-Anweisungen verwendet. Es verwendet keine Joins.

Also, da Sie drei with() Aussagen haben, werden Sie tatsächlich vier separate Abfragen ausgeführt werden, ein Ihre EventDetails, zu bekommen und dann ein jeder Ihre details_sub, extras zu laden, und chargesDiscounts für die geladenen Ereignisdetails.

Da es sich um separate Abfragen handelt, werden sie nicht im Ausgang toSql() angezeigt.


Andere Anmerkungen:

  • Wenn die Ereignis-IDs bekommen, brauchen Sie nicht ->get()->lists() anrufen, können Sie einfach ->lists() auf der Abfrage aufrufen. Wenn Sie zuerst get() aufrufen, lädt es die vollständigen Objekte in eine Collection, und dann rufen Sie lists() auf der Collection. Sie können das Laden des vollständigen Collection an erster Stelle vermeiden, indem Sie einfach lists() auf die Abfrage selbst aufrufen.

  • Angenommen, Sie haben die Beziehungen eingerichtet, können Sie die erste Abfrage vermeiden, um die IDs an erster Stelle zu bekommen. Sie können stattdessen die whereHas() method verwenden. Ihre Abfrage würde wie folgt aussehen:

    $lastUpdate = Input::get('last_update'); 
    $userId = Auth::user()->id; 
    
    // assumes a relationship named 'vendor' 
    $events = EventDetails::whereHas('vendor', function($query) use ($userId) { 
          // $query is query for the EventVendors 
          $query->where('user_id', $userId)->where('is_active', 1) 
         }) 
         ->where(function($query) use ($lastUpdate) { 
          $query->where('created_at', $lastUpdate); 
          $query->orWhere('updated_at', $lastUpdate); 
         }) 
         ->where('is_active', 1) 
         ->with("details_sub") 
         ->with("extras") 
         ->with("chargesDiscounts") 
         ->toSql(); 
    
+0

user3718908 Ich habe meine Antwort aktualisiert, um einige Informationen zu Ihrem 0 = 1 Problem zu erhalten. – patricus