2016-10-20 1 views
0

Während ich eine Laravel-Webanwendung baute, sah ich ein interessantes Problem und ich glaube, es sollte eine Best Practice sein, um dieses Problem zu lösen, ohne das Rad neu zu erfinden.Eloquente Viele-zu-viele-Beziehung und Verwendung von Pivot-Tabelle als separates Modell

Grundsätzlich habe ich viele-zu-viele-Beziehung:

Beitrag viele Kategorien, sondern zugleich Kategorien hat auch viele Beiträge haben. Jede Kategorie, die zu dem Beitrag gehört, kann "Stimmen" haben. Diese Stimmen gehören nicht generell in die Kategorie, sondern nur in den Pivot-Tabelleneintrag category_post.

Meine Frage ist: Sollte ich ein separates Modell "CategoryPost" erstellen und dann eins zu viele Beziehung mit "Votes" -Tabelle von gibt es eine elegantere Möglichkeit, es zu implementieren.

Ich versuche auch, den Abfrageprozess so ausdrucksstark wie möglich zu machen. Grundsätzlich

+0

Sie eine zusätzliche Spalte im Gespräch sind in Pivot-Tisch? Wenn ja, dann ist es möglich, dies ohne ein neues Modell zu tun. Hier finden Sie Details. https://laravel.com/docs/5.3/eloquent-relationships#updating-many-to-many-relationships –

+0

Nicht wirklich. Ich muss eine Beziehung mit der Pivot-Tabelle erstellen. Pivot-Tabelle hat ID, post_id und category_id Felder und es gibt eine andere Tabelle Abstimmungen und im Grunde brauche ich Benutzer, um Stimmen zur ID der Pivot-Tabelle hinzufügen zu können. Tut mir leid, wenn es nicht sehr gut erklärt wird. Die Struktur ist etwas schwierig, da diese Stimmen zur ID der Pivot-Tabelle gehören und wenn ich den Beitrag anzeigen muss, muss ich die Anzahl der Likes (Anzahl der Zeilen in Likes-Tabelle, wo die pivot_id == pivot_table.id) –

+0

Oh! Hab es jetzt verstanden. Ich würde für 'CategoryPost'-Modell mit eins-zu-viele-Beziehung mit' votes' Tisch dann gehen, wie Sie erwähnten. Nichts Elegantes außer dem kommt gerade jetzt in diesem Moment auf. Warten wir auf andere Vorschläge. –

Antwort

0

Ich schrieb einen solchen Code in der Kategorie Klasse:

public function votes() 
{ 
    // find id of pivot table column 
    $categoryPost = CategoryPost::where('skill_id', $this->id)->first(); 
    if($categoryPost) { 

     $likes = Like::where('likeable_id', $categoryPost->id)->get(); 

     if(count($likes)) { 
      return count($likes); 
     } else { 
      return 0; 
     } 
    } else { 
     return 0; 
    } 
} 

und zugleich habe ich Klasse CategoryPost hinzugefügt. Jetzt wohl die eleganteste Lösung, aber wenn es einen besseren Vorschlag gibt, wäre es großartig.

0

Von Laravel Dokumentation über Eloquent Relationships L 5.2:

Counting Beziehung Ergebnisse

Wenn Sie die Anzahl der Ergebnisse aus einer Beziehung ohne tatsächlich zu laden, sie zählen möchten Sie die withCount Methode verwenden, die wird eine {relation} _count Spalte auf den resultierenden Modellen platzieren.

Zum Beispiel:

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

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

Sie kostenlos in die „zählt“ für mehrere Beziehungen sowie Add Einschränkungen auf die Anfragen abrufen:

$posts = Post::withCount(['votes', 'comments' => function ($query) { 
    $query->where('content', 'like', 'foo%'); 
}])->get(); 

echo $posts[0]->votes_count; 
echo $posts[0]->comments_count; 
+0

Vielen Dank für Ihre Antwort, aber das ist nicht das, wonach ich eigentlich suche. Mein Fall ist anders. –

Verwandte Themen