Heim >Backend-Entwicklung >PHP-Tutorial >Begrenzen Sie Eager Loaded-Beziehungen auf Laravel-Modellen

Begrenzen Sie Eager Loaded-Beziehungen auf Laravel-Modellen

王林
王林Original
2024-09-09 18:30:15501Durchsuche

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();

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`

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`

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!

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