Begrenzen Sie Eager Loaded-Beziehungen auf Laravel-Modellen

王林
Freigeben: 2024-09-09 18:30:15
Original
455 Leute haben es durchsucht

Limit Eager Loaded Relationships on Laravel Models

Einführung

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.

Begrenzung eifriger, belasteter Beziehungen in Laravel

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();
Nach dem Login kopieren

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.

Die zugrunde liegenden SQL-Abfragen

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`
Nach dem Login kopieren

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`
Nach dem Login kopieren

Weiterführende Literatur

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!

Quelle:dev.to
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage