2016-05-12 7 views
0

Ich habe viel zu diesem Thema gesucht, kann aber keine klare und präzise Antwort finden, ob es in Eloquent möglich ist.Aggregatfunktion auf redegewandter Beziehung

Sagen wir zum Beispiel haben wir zwei Modelle Hersteller & Auto mit einer eins zu viele Beziehung.

Manufacturer.php

public function cars() 
{ 
    return $this->hasMany('App\Car'); 
} 

Car.php

public function manufacturer() 
{ 
    return $this->belongsTo('App\Manufacturer'); 
} 

Mit einfachen alten SQL ich folgende effizient tun können:

SELECT 
m.id, 
m.slug, 
m.title, 
m.content, 
ROUND(AVG(NULLIF(c.status ,0))) AS 'score' 
FROM 
manufacturers m 
INNER JOIN cars c ON c.manufacturer_id = m.id 
GROUP BY m.id 

möchte ich tun das Gleiche in eloquent. Ich habe verschiedene Dinge ausprobiert, aber ich kann nicht sehen, wie man die AVG-Funktion in die Autos-Statusspalte einbezieht.

kann ich alle Hersteller und ihre zugehörigen Autos mit dem folgenden erhalten:

$manufacturers = App\Manufacturer::with('cars')->get(); 

Aber wenn ich die AVG auf die Abfrage Ereignis mit DB::raw hinzufügen beschwert sich, dass die Spalte nicht existiert. Ist es möglich, die AVG-Spalte als Teil des Ergebnisses auf diese Weise in Eloquent abzurufen oder muss dies nach dem Abrufen separat geschehen.

Ich könnte natürlich die Abfrage in einem DB-Abfrage-Generator-Syntax neu schreiben, aber für diesen speziellen Anwendungsfall ist es ein wenig kontra intuitiv.

Auch ich weiß, dass Eloquent ist nur ein Wrapper für die fließende Syntax DB, aber ich frage mich, ob es möglich ist, dies in eloquenten Typ-Syntax zu tun. Hier

Antwort

0

ist die eloquente Weise:

App\Manufacturer::join('cars as c', 'manufacturers.id', '=', 'c.manufacturer_id') 
     ->select('manufacturers.id', 'manufacturers.slug', 'manufacturers.title', 'm.content', DB::raw("ROUND(AVG(NULLIF(c.status ,0))) AS 'score'")) 
     ->with('cars') 
     ->groupBy('manufacturers.id') 
     ->get(); 

Leider gibt es keine Möglichkeit, Alias ​​in Abfrage des eloqent Modells für manufacturers Tabelle zu definieren.

+0

Ah richtig, danke ich sehe jetzt. Grundsätzlich Standard-Abfrage Builder-Syntax mit dem "mit" auch für eifriges Laden geworfen. Tausend Dank. – jiraiya

Verwandte Themen