2016-10-13 3 views
10

Ich bin ideal für eine Funktion wieLaravel Eloquent faule Eager laden Count

load('relationship') 

suchen, aber die eine Zählung in der gleichen Art und Weise lädt

withCount('relationship') 

Werke für eager loading.

Ich denke, es loadCount('relationship')

Antwort

6

This solution funktioniert gut für mich angerufen werden soll:

Erstellen Ihnen eine neue hasOne Beziehung auf dem verwandten Modell und fügen Sie eine rohe wählen, um die Abfrage für die Zählung. Zum Beispiel, wenn Sie die Anzahl der Aufgaben für einen bestimmten Benutzer zu eifrig laden möchten, fügen Sie diese im User-Model:

public function taskCount() 
{ 
    return $this->hasOne('App\Task') 
    ->selectRaw('user_id, count(*) as count) 
    ->groupBy('user_id'); 
} 

Und dann eifrig Last der Graf wie folgt aus:

$user = User::where('email', $email)->with('taskCount)->first(); 

und Zugang die Anzahl wie folgt:

$taskCount = $user->task_count->count; 
+0

Diese sucht wirklich Gut und der Link, den Sie bereitstellen, enthält ein benutzerdefiniertes Accessor, das es noch einfacher macht. Ich muss nur bestätigen, dass es mit faul eifrigem Laden funktioniert und wir sind weg. – edlouth

+0

Es wäre besser, wenn Laravel diese Funktion eingebaut haben mit Eloquent ... – fsasvari

+0

Es tut. Überprüfe meine Antwort. – rzb

1

Ab Laravel 5.2 ist diese Funktionalität integriert.

Sofern Sie eine hasMany Beziehung zwischen Pfosten haben und Kommentar, tun:

<?php 

$posts = App\Post::withCount('comments')->get(); 

foreach ($posts as $post) { 
    echo $post->comments_count; 
} 

können Sie sogar eifrig Last Beziehungen zählen standardmäßig durch diese in Ihrem Modell erklärt:

<?php 

// Post model 

protected $withCount = ['comments']; 
+0

Das ist alles richtig, aber ich war auf der Suche nach faul eifrig Laden ([siehe] (https://laravel.com/docs/5.5/eloquent-relationships#lazy-eager-loading)), dh in der Lage, eine Anzahl zu laden nachdem das Modell bereits abgerufen wurde. – edlouth

+0

Nun, ich glaube nicht, dass die akzeptierte Antwort das für Sie tut. Der Zweck dieses Ansatzes war es, die Tatsache zu umgehen, dass Eloquent zu der Zeit keine 'withCount()' -Methode hatte, so dass man * die Zählung nicht eifrig laden konnte. Für * Lazy Load * müssen Sie immer noch über die Sammlung von Posts iterieren und die Kommentare für jedes Post-Objekt zählen. Wenn Sie die Zählung nur zwischenspeichern möchten, um zu vermeiden, dass die DB mehrere Male für denselben Post auftritt, wäre ein viel einfacherer beredter Accessor, der den Wert in einer Modelleigenschaft speichert, ausreichend. Aber nochmal, du musst die db mindestens einmal für jeden Post treffen. – rzb

Verwandte Themen