2016-10-22 8 views
0

Ich lerne Laravel, und ich benutze Laravel 5.2. Ich möchte etwas über Eager Loading, Eager Loads und Eager Loading wissen. Was sind die Ähnlichkeiten und Unterschiede zwischen diesen drei? Können Sie für jedes von ihnen ein Beispiel geben? Ich habe Laravel Dokumentation gelesen, aber ich verstehe es immer noch nicht. Ich hoffe, Sie können eine klarere Erklärung geben. Vielen Dank.Eager Loading, Eager Lasten einschränken, Faul Eager Loading

Antwort

1

Nutshell:

Eager Loading ermöglicht es Ihnen, die Beziehungen für einige Modelle effizient zu erhalten.

Constraining Eager Loads Wieder macht es effizient, aber Sie können Ihre Ergebnisse z. Datumsbereich, spezifische ID etc

Lazy Eager Loading Ist für, wenn Sie bereits Ihre Eltern Modelle haben geladen

Beispiel:

Ok, können Sie sagt einen Blog machen, wo Sie Beiträge haben und diejenigen Beiträge schreiben können habe Kommentare und Likes.

Szenario 1:

Sie wollen alle die Posts mit ihren Comments und ihre Likes zu bekommen. Würden Sie alle Posst laden und dann durchlaufen sie und erhalten Sie comments und likes? Nun, Sie könnten, aber das könnte am Ende sehr teuer sein, da es am Ende viele, viele Abfragen durchführen könnte. Oder Sie könnten die Beiträge laden und dann ihre id s und laden Sie alle Kommentare, die Sie für diese id s und das gleiche für dort likes auch benötigen. Dies ist im Wesentlichen, was Laravel mit eifrigen Laden tut.

Szenario 2 (eine reale Welt Beispiel für Szenario 1):

Sie erstellen Sie für die Beiträge einzuziehen. So haben Sie alle Ihre Beiträge geladen und dann wollen Sie, wie viele Leute zeigen, und kommentieren es hat so würde man so etwas (sehr einfach) hat:

Controller:

$posts = App\Post::all(); 

return view('posts.index', compact('posts')); 

Blade-Datei:

@foreach($posts as $post) 

    <h2>{{ $post->title }}</h2> 

    <p>{{ $post->description }}</p> 

    <p> 
     Likes: {{ $post->likes->count() }} <br> 
     Comments: {{ $post->comments->count() }} 
    </p> 

@endforeach 

Das obige würde funktionieren, aber für jede Schleife würde es tatsächlich die Datenbank abfragen. Ändern Sie Ihre Controller:

$posts = App\Post::with('likes', 'comments')->get(); 

return view('posts.index', compact('posts')); 

Wird dann bekommen die comments und likes für alle der Posts vorher die Datenbank speichern und Ihre Anwendung wesentlich effizienter machen.

Szenario 3

ich die Posts zeigen wollen, aber ich will nur die letzten 3 comments zeigen, die gemacht wurden.

$posts = App\Post::with(['comments' => function ($query) { 

     $query->limit(3); 

    }]); 

Lazy Eager Loading ist, wenn Sie bereits Ihre Posts geladen und Sie müssen dann alle comments oder likes nach der Tat zu bekommen.Gleiches Prinzip, aber Sie würden load anstelle von with verwenden. Ein weiterer Grund, warum Sie Last verwenden könnten, ist, wenn Sie Route model binding für Ihre Controller verwenden, so dass die Post bereits abgerufen wurde, aber Sie wollen immer noch seine Beziehungen erhalten.

Hoffe diese Hilfe!

+0

Nun, ich verstehe es nicht wirklich. Weil ich in all Ihren Beispielen Beschränkungen/Beschränkungen für das verwenden kann, was ich laden möchte. Wird diese Beschränkung zur Ähnlichkeit zwischen ihnen? Was ist der Unterschied? Sorry, ich bin noch neu in diesem Thema –

+0

@GraceMichelle Ja, das ist es ziemlich viel. Wenn du sie einschränken willst, kannst du es sein, musst du nicht. Der Hauptunterschied ist zwischen "eifrigem Laden" und "faulen eifrigen Laden" - der erste ist, wenn Sie die Eltern laden, und der zweite ist, wenn die Eltern bereits geladen sind. –

+0

Gibt es eine weitere Ähnlichkeit? Ok, ich weiß über diese zwei Unterschiede Bescheid. Dann, was ist der Unterschied zwischen diesen zwei und "Constraint Eager Lasten"? –

Verwandte Themen