Wenn Sie Beziehungen zu Laravel-Modellen laden möchten, möchten Sie manchmal die Anzahl der zurückgegebenen zugehörigen 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 von Eager Loaded-Beziehungen eine etwas knifflige Aufgabe. Ich konnte nie wirklich einen eleganten Weg finden, es richtig zu machen. 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.
Sehen 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.
Wir können dies erreichen, indem wir die Limit-Methode in der Eager-Loading-Abfrage verwenden:
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 Modell App\Models\Author 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`Weiterführende Literatur
Wenn Ihnen die Lektüre dieses Beitrags gefallen hat, könnte es Sie interessieren, sich mein 220-seitiges E-Book „Battle Ready Laravel“ anzusehen, das ähnliche Themen ausführlicher behandelt.
Vielleicht möchten Sie sich auch mein anderes 440-seitiges 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! ?
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3