Heim >Datenbank >MySQL-Tutorial >Wie wähle ich mit dem Query Builder von Laravel elegant aus einer Unterabfrage aus?
Wählen Sie mit dem Laravel-Abfrage-Builder elegant Daten aus Unterabfragen aus
In einem aktuellen Projekt haben Sie Eloquent ORM verwendet, um Daten aus einer Datenbank abzurufen. Eine der Anforderungen besteht darin, eine Unterabfrage zu verwenden, um die Anzahl der Datensätze in einer bestimmten Spalte zu zählen. Hier ist die SQL-Abfrage, die Sie ausführen möchten:
<code class="language-sql">SELECT COUNT(*) FROM (SELECT * FROM abc GROUP BY col1) AS a;</code>
Ihr erster Versuch, die Methoden from()
und groupBy()
des Abc-Modells zu verwenden:
<code class="language-php">$sql = Abc::from('abc AS a')->groupBy('col1')->toSql(); $num = Abc::from(\DB::raw($sql))->count(); print $num;</code>
Sie suchen jedoch nach einer eleganteren Lösung.
Komplettlösung
Der Laravel-Abfrage-Builder bietet keine direkte Möglichkeit, Unterabfragen in der FROM-Klausel zu erstellen. Daher müssen Sie die Roh-SQL-Anweisung manuell erstellen. Dazu können Sie die folgenden Methoden verwenden:
<code class="language-php">$sub = Abc::where(...)->groupBy(...); // Eloquent Builder 实例 $count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) ->mergeBindings($sub->getQuery()) // 合并所有绑定 ->count();</code>
Um genaue Ergebnisse zu gewährleisten, achten Sie darauf, die Bindungen in der richtigen Reihenfolge zusammenzuführen. Wenn Sie andere verbindliche Klauseln haben, sollten Sie diese nach mergeBindings()
einfügen:
<code class="language-php">$count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) // ->where(...) 错误的位置 ->mergeBindings($sub->getQuery()) // 合并绑定 // ->where(...) 正确的位置 ->count();</code>
Diese Lösung bietet eine einfache und effiziente Möglichkeit, Unterabfragen mit komplexen Bedingungen und Bindungen auszuführen.
Das obige ist der detaillierte Inhalt vonWie wähle ich mit dem Query Builder von Laravel elegant aus einer Unterabfrage aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!