2016-07-26 5 views
0

Ich versuche, eine Tabelle in meiner Ansicht mit Inhalten anzuzeigen, die aus Informationen aus meiner Standorttabelle (Addr, Stadt, etc ...) und Ressourcentabelle (Name, Descr.) Bestehen, sie sind durch IDs miteinander verbunden eine Ressourcenstandort-Tabelle. Hier ist, was ich bisher:So zeigen Sie eine hasMany() - Beziehung über eine Tabelle in einer Ansicht an.

Resource Controller

.... 
 

 
public function resource() 
 
{ 
 
    $resources = Resource::all(); 
 
    return view('pages.resource', compact('resources')); 
 
} 
 

 
public function location() 
 
{ 
 
    $locations = Location::all 
 
    return view (compact('locations')); 
 
} 
 

 
public function resourcelocation() 
 
{ 
 
    $resourcelocations = ResourceLocation::all(); 
 
    return view (compact ('resourcelocations')); 
 
} 
 

 
...
ResourceLocation Modell

/** 
 
* Class ResourceLocation 
 
*/ 
 
class ResourceLocation extends Model 
 
{ 
 
    ... 
 

 
    public function resource() 
 
    { 
 
     return $this->belongsTo('App\Models\Resource'); 
 
    } 
 

 
    public function location() 
 
    { 
 
     return $this->belongsTo('App\Models\Location'); 
 
    }  
 
}

Ressourcenmodell

/** 
 
* Class Resource 
 
*/ 
 
class Resource extends Model 
 
{ 
 

 
... 
 

 
/** A resource can have many locations */ 
 

 
    public function location() 
 
    { 
 
    return $this->hasMany('App\Models\ResourceLocation'); 
 
    }  
 
}
Location Modell

/** 
 
* Class Location 
 
*/ 
 
class Location extends Model 
 
{ 
 
... 
 
    public function resource() 
 
    { 
 
     return $this->hasMany('App\ResourceLocation'); 
 
    } 
 
}
resource.blade.php

<table> 
 
    <tr> 
 
     <th>Resource Name</th> 
 
     <th>Description</th> 
 
     <th>Address</th> 
 
     <th>City</th> 
 
     <th>Zip Code</th> 
 
     <th>County</th> 
 
    </tr> 
 
    @foreach ($resourcelocations as $resourcelocation) 
 
    <tr> 
 
     <td> {{ $resourcelocation->id }}</td> 
 
     <td> 
 
     @foreach ($resourcelocation->resources as $resource) 
 
      {{ $resource->Name }}, 
 
     @endforeach 
 
     </td> 
 
     <td> 
 
     @foreach($resourcelocations->locations as $location) 
 
      {{ $location->City }} 
 
        @endforeach 
 
     </td> 
 
     </tr> 
 
     @endforeach 
 
</table>

Ich wollte nur eine Spalte oder zwei zu sehen, hinzuzufügen, wenn es funktioniert, aber ich halte eine undefinierte Variable auf resourcelocations immer noch versucht, meinen Kopf um Laravel zu wickeln und wie die Beziehungen arbeiten, so vielleicht ist meine Logik durcheinander. Jede Hilfe wäre großartig!

Danke.

Antwort

1

Es scheint einige Verwirrung in Ihren Beziehungen zu geben. Ich denke, es könnte mit der Art funktionieren, wie Sie es haben, aber Sie machen es viel verwirrender, als es sein muss.

Zuerst mit dem Entfernen des ResourceLocation Modells beginnen. Sie können sich direkt auf resources und locations beziehen, ohne das Zwischenmodell zu benötigen (Sie werden diese Tabelle trotzdem benötigen). Dies ist, was eine Beziehung zwischen vielen und vielen nennt.

Ich empfehle auch, wenn Sie eine Beziehung haben, die viele Datensätze zurückgeben kann (zum Beispiel wenn eine Ressource viele Standorte haben kann), sollten Sie die Methode, die diese locations verbindet, statt location nennen.

Mit allem daran, Ihr Resource Modell bekommt ...

public function locations() 
{ 
    return $this->belongsToMany('App\Models\Location', 'ResourceLocation'); 
} 

Wo ich 'ResourceLocation' setzen, sollte das sein, was Sie Pivot-Tabelle mit dem Namen.

Gleiches für Ihr Location Modell, das empfängt.

Nun, das sollte stark vereinfacht werden, haben wir nur 4 Beziehungsmethoden und 3 Modelle für 2 Beziehungsmethoden und 2 Modelle ersetzt.

Jetzt für Ihren Controller ist es viel effizienter, eifrig zu laden, um alle Ihre Ressourcen Standorte zu greifen.

$resources = Resource::with('locations')->get(); 

Und Ihrer Ansicht nach ...

@foreach ($resources as $resource) 
    @foreach ($resource->locations as $location) 
     <tr> 
      <td>{{ $resource->id }}</td> 
      <td>{{ $location->name }}</td> 
     </tr> 
    @endforeach 
@endforeach 
+0

Danke. Ich wusste nicht, dass Sie die beiden Tabellen verbinden können, indem Sie nur diese Anweisung verwenden. Ich dachte an SQL-Join-Anweisungen. ** EDIT ** Alles klar, die Namensräume waren anders. Fortschritt, ich sehe die Tabellen, nur keine Daten. – ph0bolus

+0

Die Funktion 'belongsToMany' übernimmt zusätzliche Parameter für die IDs. Wenn Sie anders sind als Laravel erwartet, gibt es wahrscheinlich keine Daten zurück. Wie heißen Ihre IDs in Ihrer 'ResourceLocation' Tabelle? – user3158900

+0

Entschuldigung, ich habe es herausgefunden. anstelle von '{{$ resource-> name}}' war es 'Name' in meiner Datenbank, also war alles leer. Nachdem ich sie alle groß geschrieben habe, zeigten die Daten korrekt. Danke noch einmal! – ph0bolus

0

In Ihrem Resource Controller übergeben Sie keine resourcelocation Variable, wie ich nur resources genannt habe. versuchen, die Variable in dem Feld in dieser Zeile erklärt return view('pages.resource', compact('resources'));

Um das erste Element in hasMany erhalten Sie unten versuchen:

$resource->location()->first(); 

Sie dd(variable_name) vor dem Senden der Daten zu der Ansicht, eine bessere Vorstellung bekommen von verwenden können, wie Ihre Daten verwaltet werden

Verwandte Themen