2016-04-21 7 views
0

Ich brauche eine Auswahl Abfrage in Laravel 5.1, die ich habe keine Probleme mit dem Erstellen von regulären SQL und ich frage mich, ob Sie mir helfen könnten, es in Laravel zu schreiben.Laravel Abfrage mit Max und Gruppe von

Ich habe diese Abfrage erstellt, die alle Benutzer, die einen LKW, Anhänger und Lieferdatum haben, entspricht einem bestimmten Datum (stammt aus $ week_array). Es funktioniert, aber es wird einige Komponenten

$RS = $this->instance->user() 
     ->with(['driver.delivery' => function($query) use ($week_array) { 
      $query->where('delivery_date', [Carbon\Carbon::parse($week_array['date'])->toDateTimeString()]); 
      }]) 
     ->with(['driver.trailer', 'driver.truck', 'driver.trailer.trailerType'])->get(); 

ich die Treiber ausschließen müssen fehlen, die MAX Liefertermin haben, die gleich oder größer als ausgewählten Lieferdatum in der Abfrage oben. Dies ist die normale Abfrage, die ich in Laravel einstecken muss.

Mit anderen Worten, ich brauche die folgende Abfrage (vereinfacht) zu Laravel konvertieren:

für whereHas
SELECT 
    * 
FROM 
    USERS 
     INNER JOIN 
    DRIVERS ON DRIVERS.user_id = USERS.id 
     INNER JOIN 
    DELIVERIES ON DELIVERIES.driver_id = DRIVERS.id 
WHERE 
    1 = 1 
     AND DELIVERIES.driver_id NOT IN (SELECT 
      driver_id 
     FROM 
      DELIVERIES 
     GROUP BY driver_id 
     HAVING MAX(delivery_date) >= '2016-05-10') 
+0

Ich habe Angst, ich habe Ihre Frage nicht vollständig verstanden. Haben Sie Probleme mit der Auswahl der MAX Werte? – Jackowski

+0

Ich habe ein vereinfachtes SQL hinzugefügt, das funktioniert und das ich zu konvertieren versuche. – Andrew

Antwort

2

Sie suchen. Versuchen:

$date = Carbon\Carbon::parse($week_array['date'])->toDateTimeString(); 

$RS = $this->instance->user() 
    ->with(['driver.delivery' => function($query) use ($date) { 
     $query->where('delivery_date', [$date]); 
    }]) 
    ->with(['driver.trailer', 'driver.truck', 'driver.trailer.trailerType']) 
    ->whereHas('driver.delivery', function($query) use ($date) { 
     return $query->where('delivery_date', '>', $date); 
    }, '=', 0) 
    ->get(); 

Versuchen Sie auch die Validierung der Abfrage sieht direkt ->get() mit ->toSql() und mit Hilfe der dd Hilfsfunktion zu ersetzen.

+0

Scheint, als ob du das letzte_Lieferdatum zurücksendest, ich muss sicherstellen, dass driver_id nicht in der Liste von max (deliveries.delivery_date)> = $ date ist. – Andrew

+0

Fehler: 'Spalte nicht gefunden: 1054 Unbekannte Spalte 'max (Lieferdatum)' in 'Feldliste' ' – Andrew

+0

Können Sie die generierte SQL-Datei kopieren und einfügen? – Scopey