Heim >Backend-Entwicklung >PHP-Tutorial >Begrenzen Sie Eager Loaded-Beziehungen auf Laravel-Modellen
Manchmal, wenn Sie Beziehungen zu Laravel-Modellen laden möchten, möchten Sie möglicherweise die Anzahl der zurückgegebenen verwandten Modelle begrenzen.
Auf einer Blogging-Plattform möchten Sie beispielsweise jeden Autor im System zusammen mit drei seiner Beiträge laden.
In älteren Versionen von Laravel war das Einschränken eifriger geladener Beziehungen eine etwas knifflige Aufgabe. Ich konnte nie wirklich einen eleganten Weg finden, es so zu machen, dass es sich richtig anfühlte. Daher habe ich normalerweise das Paket staudenmeir/eloquent-eager-limit von Jonas Staudenmeir (@staudenmeir) installiert, das diese Funktionalität hinzufügt.
Anfang dieses Jahres wurde die Kernfunktionalität dieses Pakets jedoch in das Laravel-Framework selbst integriert. Das bedeutet also, dass wir in Laravel 11 Eager Loaded-Beziehungen einschränken können, ohne zusätzliche Pakete installieren zu müssen.
Schauen wir uns ein Beispiel an.
Angenommen, wir haben eine Blogging-Plattform und möchten jeden Autor im System zusammen mit drei seiner Beiträge laden.
Dies können wir mithilfe der Limit-Methode in der Eager-Loading-Abfrage erreichen:
use App\Models\Post; use App\Models\Author; use Illuminate\Contracts\Database\Eloquent\Builder; $authors = Author::query() ->with([ 'posts' => fn (Builder $query): Builder => $query->limit(3), ]) ->get();
Wie wir im obigen Codebeispiel sehen können, haben wir definiert, dass wir die Posts-Beziehung im AppModelsAuthor-Modell eifrig laden möchten. In der Eager-Loading-Abfrage haben wir die Limit-Methode verwendet, um anzugeben, dass wir nur drei Beiträge laden möchten.
Für alle Interessierten: Die obige Abfrage würde zwei SQL-Abfragen generieren.
Die erste Abfrage ruft die Autoren aus der Datenbank ab:
SELECT * FROM `authors`
Die zweite Abfrage ruft die drei Beiträge für jeden Autor ab (vorausgesetzt, wir haben 5 Autoren im System):
SELECT * FROM ( SELECT *, row_number() OVER (PARTITION BY `posts`.`author_id`) AS `laravel_row` FROM `posts` WHERE `posts`.`author_id` IN (1, 2, 3, 4, 5) ) AS `laravel_table` WHERE `laravel_row` <= 3 ORDER BY `laravel_row`
Wenn Ihnen die Lektüre dieses Beitrags gefallen hat, könnte es für Sie interessant sein, sich mein über 220 Seiten umfassendes E-Book „Battle Ready Laravel“ anzusehen, in dem ähnliche Themen ausführlicher behandelt werden.
Vielleicht möchten Sie sich auch mein anderes über 440 Seiten umfassendes E-Book „Consuming APIs in Laravel“ ansehen, in dem Sie erfahren, wie Sie mit Laravel APIs von anderen Diensten nutzen.
Wenn Sie jedes Mal, wenn ich einen neuen Beitrag veröffentliche, auf dem Laufenden bleiben möchten, können Sie sich gerne für meinen Newsletter anmelden.
Bauen Sie weiterhin tolle Sachen! ?
Das obige ist der detaillierte Inhalt vonBegrenzen Sie Eager Loaded-Beziehungen auf Laravel-Modellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!