2012-11-04 8 views
40

Hier ist meine Abfrage mit fließenden Abfrage-Generator.Wie wählt man mit Laravels flüssigem Query Builder?

$query = DB::table('category_issue') 
     ->select('issues.*') 
     ->where('category_id', '=', 1) 
     ->join('issues', 'category_issue.issue_id', '=', 'issues.id') 
     ->left_join('issue_subscriptions', 'issues.id', '=', 'issue_subscriptions.issue_id') 
     ->group_by('issues.id') 
     ->order_by(DB::raw('COUNT(issue_subscriptions.issue_id)'), 'desc') 
     ->get(); 

Wie Sie sehen können, bestelle ich durch eine Zählung aus der verbundenen Tabelle. Das funktioniert gut. Ich möchte jedoch, dass diese Anzahl mit meiner Auswahl zurückgegeben wird.

Hier ist die meine rohe Fortsetzung Abfrage, die gut funktioniert.

Select issues.*, COUNT(issue_subscriptions.issue_id) AS followers 
FROM category_issue JOIN Issues ON category_issue.issue_id = issues.id 
LEFT JOIN issue_subscriptions ON issues.id = issue_subscriptions.issue_id 
WHERE category_issue.category_id = 1 
GROUP BY issues.id 
ORDER BY followers DESC 

Wie würde ich mit Laravel's fließendem Query Builder auswählen? Ich bin mir bewusst, dass ich eine rohe SQL-Abfrage verwenden kann, aber ich möchte das, wenn möglich, vermeiden. Jede Hilfe wäre willkommen, danke im Voraus!

Antwort

72

Sie können ein Array in select() verwenden, um weitere Spalten zu definieren, und Sie können dort DB :: raw() mit Aliasing für Follower verwenden. Sollte so aussehen:

$query = DB::table('category_issue') 
    ->select(array('issues.*', DB::raw('COUNT(issue_subscriptions.issue_id) as followers'))) 
    ->where('category_id', '=', 1) 
    ->join('issues', 'category_issue.issue_id', '=', 'issues.id') 
    ->left_join('issue_subscriptions', 'issues.id', '=', 'issue_subscriptions.issue_id') 
    ->group_by('issues.id') 
    ->order_by('followers', 'desc') 
    ->get(); 
23
$count = DB::table('category_issue')->count(); 

gibt Ihnen die Anzahl der Elemente.

Für weitere Informationen überprüfen fließend Query Builder Abschnitt in .

+0

ahh ja, ich war mir dessen bewusst. Außer, ich hatte gehofft, es in einer einzigen Abfrage zu tun, ähnlich der rohen Fortsetzung, die ich gepostet habe. Dieser Ansatz würde erfordern, dass ich meine Daten durchlaufe und sie für jede Zeile zähle (die Anzahl jeder Zeile kann und wird unterschiedlich sein). Irgendwelche anderen Ideen? Danke für die Hilfe! –

+0

Link funktioniert nicht mehr :( – Damon

+1

Danke @Damon Ich habe den Link aktualisiert. –

Verwandte Themen