Heim >Datenbank >MySQL-Tutorial >Wie kann man Datensätze aus einer Laravel-Unterabfrage mit GROUP BY effizient zählen?

Wie kann man Datensätze aus einer Laravel-Unterabfrage mit GROUP BY effizient zählen?

Susan Sarandon
Susan SarandonOriginal
2025-01-12 06:06:411016Durchsuche

How to Efficiently Count Records from a Laravel Subquery with GROUP BY?

Unterabfrageauswahl im Laravel Query Builder

Das Auswählen von Daten aus einer Unterabfrage mit dem Abfrage-Builder des Eloquent ORM kann eine Herausforderung sein. In diesem Artikel geht es um ein spezielles Problem, mit dem ein Benutzer konfrontiert war, der die Datensatzanzahl für eine mit GROUP BY erstellte Unterabfrage abrufen wollte.

Tauchen Sie ein in die Fragen:

Benutzer haben zunächst versucht, dieses Problem mit dem folgenden Code zu beheben:

<code class="language-php">$sql = Abc::from('abc AS a')
    ->groupBy('col1')
    ->toSql();
$num = Abc::from(DB::raw($sql))
    ->count();
print $num;</code>

Obwohl dieser Ansatz logisch erscheint, ist er nicht die effizienteste Lösung.

Elegante und optimierte Lösung:

Die vorgeschlagene Lösung beinhaltet die Verwendung einer Kombination aus Roh-SQL und Bindungszusammenführung:

<code class="language-php">$sub = Abc::where(..)
    ->groupBy(..); // Eloquent Builder 实例

$count = DB::table(DB::raw("({$sub->toSql()}) as sub"))
    ->mergeBindings($sub->getQuery()) // 以正确的顺序合并绑定
    ->count();</code>

In dieser Lösung wird die Unterabfrage mithilfe einer Eloquent Builder-Instanz erstellt und dann in einen unformatierten SQL-Ausdruck eingebunden. Die mergeBindings()-Methode wird verwendet, um die Bindungen einer Unterabfrage mit den Bindungen der Hauptabfrage zu kombinieren. Auf diese Weise können Sie die erforderlichen Daten effizient aus der Unterabfrage abrufen.

Das obige ist der detaillierte Inhalt vonWie kann man Datensätze aus einer Laravel-Unterabfrage mit GROUP BY effizient zählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn