2016-11-10 3 views
1

Ich arbeite auf einer Link-Sharing-Website und müssen die Links durch ihre Stimmen bestellen.Laravel 5 orderBy Beziehung zählen und Seitenumbruch

Ich habe eine 'Links' Tabelle und eine Link_votes Tabelle.

Die Tabelle link_votes enthält ein Referenzfeld 'link_id' zum Feld 'ID' der Verknüpfungstabelle.

Ich habe eine hasMany Beziehung in meinem Link-Modell:

public function votes() 
{ 
    return $this->hasMany('\App\LinkVote'); 
} 

Dies gibt alle Zeilen (jede Zeile ist eine einzige Stimme) int er link_votes Tabelle.

Meine Standard-Abfrage, um alle meine Links und um sie erstellt von Datum ist:

$links = Link::withCount('votes')->orderBy('votes_count', 'desc')->paginate(10); 

Was wünsche ich jetzt zu tun ist, um meine Links durch die Menge der Stimmen, die sie haben.

Was ich habe, zur Zeit ist:

$links = Link::orderBy('created_at', 'desc')->with('votes')->paginate(20); 

Dies funktioniert, aber fast zu gut. Ich habe zwei Arten von Stimmen in meiner Tabelle link_votes, indem ich ein vote_type-Feld habe. Wenn die Stimme ein upvote ist, ist es eine Art von 1, aber wenn es ein downvote ist eine Art von 2.

Das Problem ist hier durch die Bestellung von vote count seine alle Stimmen als eine Zählung und Putting Stimmen mit einer negativen Stimme oben diese Links, die keine Stimmen haben.

Ich muss einen Weg finden, durch die Summe der upvotes (vote_type = 1) minus der downvotes (vote_type = 2) zu bestellen.

Meiner Ansicht nach zeige ich die Stimmenzahl, indem ich Mathe mache.

Antwort

1

Eine Änderung der Logik erlaubt mir, dies einfacher als zuerst gedacht.

Alles, was ich tun musste, war, die positiven (upvotes) als die Zählung zu zählen, weil sie die einzigen sind, die zählen.

$links = Link::withCount([ 
     'votes' => function ($query) { 
      $query->where('vote_type', 1); 
     } 
    ]) 
    ->orderBy('votes_count', 'desc') 
    ->paginate(10); 
:

Um dies zu tun, ich habe die withCount geändert