2017-08-17 6 views
0

Ich habe Probleme mit der Auswahl aus zwei Tabellen mit hasMany, belongsToMany etc Beziehungen.Auswählen und Anzeigen von Spalten mit hasMany Beziehung Laravel

Ich habe Tabelle items

id 
title 

und Tabelle review

id 
item_id 

dies in meinem Artikel Modell ist

public function review() 
{ 
    return $this->hasMany('App\Review', 'item_id','id'); 
} 

In meinem Review-Modell

-Controller

public function index() 
{ 
    $reviews = Review::with('item')->get(); 
    return view('index', compact('reviews')); 
} 

und im Hinblick möchte ich all reviews von Bewertungen Tisch zeigen und titles von Artikel Tisch.

@foreach($reviews as $review)  
    {!!$review->item()->title!!}  
@endforeach 

Der Fehler

SQLSTATE [42S02]: Basistabelle oder Ansicht nicht gefunden: 1146 Table 'ps.item_id' existiert nicht (SQL:. items select *, item_idid wie. pivot_id, item_id. item_id als pivot_item_id von items inneren item_id auf items verbinden. id = item_id. item_id wo item_id. id in (15, 16, 17, 18, 19, 20, 21, 22, 23 , 24, 25))

Offensichtlich sind meine Beziehungen falsch. Kann mir hier jemand ein bisschen helfen?

+0

Ihre 'gehört zuMany'-Beziehung im' Review'-Modell sollte eine 'goesTo'-Beziehung sein. – milo526

Antwort

1

Der Aufbau Ihrer Beziehung ist etwas falsch.

Sie haben derzeit eine hasMany Beziehung mit der umgekehrten belongsToMany, dies ist eine Viele-zu-viele-Beziehung.

Dies bedeutet, dass jedes Element mehrere Bewertungen hat (was richtig ist).
Aber dies bedeutet auch, dass jede Überprüfung für mehrere Elemente gilt (was ich glaube, ist falsch).

dies beheben Sie Ihre item() Funktion innerhalb Review mit folgendem ersetzen könnten:

public function item() 
{ 
    return $this->belongsTo('App\Item', 'item_id','id'); 
} 

dies Ihre Beziehung ändern wird eine Eins-zu-viele-Beziehung zu sein.

Jedes Element hat noch mehrere Bewertungen, aber jetzt ist jede Bewertung nur mit einem Element verknüpft. Dies ermöglicht auch, dass Ihr anderer Code (der Controller) funktioniert.

Darüber hinaus sollten Sie die Perentesis von Ihrem Anruf in der Ansicht entfernen. Wenn Sie es als Funktion aufrufen, wird die Beziehung anstelle des tatsächlichen Modells zurückgegeben.

+0

Jetzt funktioniert es perfekt. Danke für die gute Erklärung! Wird Antwort in 5min annehmen. – Ivan

Verwandte Themen