2017-02-08 3 views
0

Ich habe eine einfache Struktur zurückzukehren, wo ein Post viele Stimmen hat. Eine Abstimmung hat eine „Wert“ Eigenschaft, die entweder 1 oder -1bester Weg, um die Summe Aggregation einer Beziehung Eigenschaft

Wenn alle Beiträge zu lesen ich diese Summe für jeden Post in eine benutzerdefinierten Eigenschaft auf Post-Ebene wählen würde gerne. Derzeit kann ich den

$posts = Post::where('published_at', '<=', $date) 
     ->orderBy('published_at', 'desc') 
     ->simplePaginate(20); 

    $posts->each(function($post) { 
     $post->overallRating = $post->getRating(); 
    }); 

Das voll funktioniert, aber ich denke, es ist nicht so gut wie 20 Anfragen an die Datenbank zu machen, die Bewertungen zu lesen. Gibt es eine Möglichkeit, dies beim tatsächlichen Abrufen der Posts zu vereinfachen?

public function getRating() 
{ 
    return $this->votes->sum('value'); 
} 
+0

konnte zeigen Ihnen die 'getRating()' Methode? –

+0

hinzugefügt, um es auf die Post –

+0

Welche Version von Laravel verwenden Sie? –

Antwort

2

Wenn Sie die Stimmen in der in den Paginierung Ergebnisse enthalten behalten wollen, dann würde ich with('votes') Zugabe empfehlen, so sind sie zumindest eifrig geladen dh

$posts = Post::with('votes') 
    ->where('published_at', '<=', $date) 
    ->orderBy('published_at', 'desc') 
    ->simplePaginate(20); 

Allerdings, wenn Sie nicht wollen/nicht über die Stimmen haben und Sie wollen nur die für jeden Bewertungen buchen Sie den folgenden Rahmen zu Ihrem Post Modell könnte hinzufügen:

public function scopeWithRating(Builder $query) 
{ 
    if (is_null($query->getQuery()->columns)) { 
     $query->select([$query->getQuery()->from . '.*']); 
    } 

    $query->selectSub(
     $this->votes()->getRelationExistenceQuery(
      $this->votes()->getRelated()->newQuery(), $query, new Expression('sum(value)') 
     )->toBase(), 
     'rating' 
    ); 
} 

Dann:

$posts = Post::withRating() 
    ->where('published_at', '<=', $date) 
    ->orderBy('published_at', 'desc') 
    ->simplePaginate(20); 

hoffe, das hilft!

+0

vielen Dank! Das ist perfekt. Ich brauche die Stimmen zu diesem Zeitpunkt wirklich nicht! –

+0

@FrankProvost Ich bin froh, dass ich helfen konnte! –

0

Versuchen Sie folgendes:

$posts = Post::where('published_at', '<=', $date) 
     ->orderBy('published_at', 'desc') 
     ->with(['votes' => function($query) { 
      $query->sum('value'); 
     }])->simplePaginate(20); 
+0

das tut die Summe zurückgeben - es gibt einfach die Beiträge mit all ihren Stimmen –

Verwandte Themen