Zusätzlich zu der Antwort von @ delmadord und Ihren Kommentaren:
Derzeit gibt es keine Methode zum Erstellen einer Unterabfrage in einer FROM
Klausel. Daher müssen Sie die Raw-Anweisung manuell verwenden. Bei Bedarf werden dann alle Bindungen zusammengeführt:
$sub = Abc::where(..)->groupBy(..); // Eloquent Builder instance
$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
->count();
Beachten Sie, dass Sie die Bindungen in der richtigen Reihenfolge zusammenführen müssen . Wenn Sie andere gebundene Klauseln haben, müssen Sie diese nach setzen mergeBindings
:
$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
// ->where(..) wrong
->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
// ->where(..) correct
->count();
belongsToMany
getQuery()
$sub->getQuery()->getQuery()
toSql
. Lesen Sie über PDO php.net/manual/en/book.pdo.php und sehen Sie das Ergebnis Ihrer$query->toSql()
$sub
Abfrage um einen Eloquent Builder handelt , benötigen Sie das->getQuery()
Teil weiterhin, andernfalls wird eine Fehlermeldung angezeigt, da diese Methode für dieQuery\Builder
Klasse typisiert ist .Laravel v5.6.12 (14.03.2018) hinzugefügt
fromSub()
undfromRaw()
Methoden zum Abfragen des Builders (# 23476) .Die akzeptierte Antwort ist korrekt, kann aber vereinfacht werden in:
Das obige Snippet erzeugt das folgende SQL:
quelle
Die Lösung von @JarekTkaczyk ist genau das, wonach ich gesucht habe. Das einzige, was ich vermisse, ist, wie es geht, wenn Sie
DB::table()
Abfragen verwenden. In diesem Fall mache ich das so:Besondere Aufmerksamkeit, wie man das
mergeBindings
ohne Verwendung dergetQuery()
Methode machtquelle
DB::raw()
hat den Job für michAb Laravel 5.5 gibt es eine spezielle Methode für Unterabfragen, die Sie folgendermaßen verwenden können:
oder
quelle
Call to undefined method subSelect()
scheintsubSelect
nicht zu existieren.selectSub
. Ich habe meine Antwort jetzt aktualisiert.Ich mache gerne so etwas:
Es ist nicht sehr elegant, aber es ist einfach.
quelle
Ich konnte Ihren Code nicht für die gewünschte Abfrage erstellen. Der AS ist nur ein Alias für die Tabelle
abc
, nicht für die abgeleitete Tabelle. Laravel Query Builder unterstützt nicht implizit abgeleitete Tabellenaliasnamen, DB :: raw wird höchstwahrscheinlich dafür benötigt.Die einfachste Lösung, die ich finden konnte, ist fast identisch mit Ihrer, erzeugt jedoch die Abfrage, wie Sie sie angefordert haben:
Die erzeugte Abfrage ist
quelle
In dieser Antwort beschriebener korrekter Weg: https://stackoverflow.com/a/52772444/2519714 Die derzeit beliebteste Antwort ist nicht ganz korrekt.
Auf diese Weise ist https://stackoverflow.com/a/24838367/2519714 in einigen Fällen nicht korrekt, z. B.: Unterauswahl hat wo Bindungen, dann Verknüpfung von Tabelle zu Unterauswahl, dann werden andere Abfragen zu allen Abfragen hinzugefügt. Beispiel: Abfrage:
select * from (select * from t1 where col1 = ?) join t2 on col1 = col2 and col3 = ? where t2.col4 = ?
Um diese Abfrage durchzuführen, schreiben Sie Code wie folgt:Während der Ausführung dieser Abfrage gibt seine Methode
$query->getBindings()
Bindungen in falscher Reihenfolge zurück, wie['val3', 'val1', 'val4']
in diesem Fall, stattdessen korrekt['val1', 'val3', 'val4']
für die oben beschriebene unformatierte SQL.Noch ein richtiger Weg, dies zu tun:
Auch Bindungen werden automatisch und korrekt mit einer neuen Abfrage zusammengeführt.
quelle