2013-07-31 20 views
9

Ich benutze Laravel 4 und insbesondere suche ich nach einer Antwort, die eloquente ORM verwendet.Laravel: Rückgabe von Ergebnissen aus mehreren verwandten Tabellen mit eloquent

Ich habe eine Tabelle „ Aufgaben“, die Behälter ein client_id und eine user_id jeder Reihe zugeordnet.

client_id auf einem "Clients" -Tabelle zu einem Client bezieht und user_id auf einem "Benutzer" -Tabelle für einen Benutzer bezieht.

Was ich will tun: alle Aufgaben zeigen und zeigen die "Kunden" Name und "Benutzer" first_name

So das Ergebnis wie dies in meinem (Klinge aussehen würde Ansicht):

@foreach($tasks as $task) 
    <tr> 
     <td>{{ $task->user->first_name }}</td> 
     <td>{{ $task->client->name }}</td> 
     <td>{{ $task->description }}</td> 
    </tr> 
@endforeach 

die obige Ansicht spuckt den aufgaben- $> client-> Namen völlig in Ordnung, aber leider zeigt ein „T rocknung Eigenschaft von nicht-Objekt zu erhalten“, wenn ich die Linie $ hinzufügen aufgaben-> user-> first_name

Mein Controller sieht wie folgt aus:

$tasks = Task::with(array('user', 'client'))->get(); 
return View::make('index', compact('tasks')); 

Wie ich es meine Modelle machen auch einen Unterschied zu verstehen, so aussehen meine Modelle wie folgt aus:

class Task extends Eloquent { 
    protected $guarded = array(); 
    public static $rules = array(); 

    public function client() { 
     return $this->belongsTo('Client'); 
    } 

    public function user() { 
     return $this->belongsTo('User'); 
    } 
} 

Und:

class User extends Eloquent implements UserInterface, RemindableInterface { 
    public function task() 
    { 
     return $this->hasMany('Task'); 
    } 
} 

Und:

class Client extends Eloquent { 
    public function projects(){ 
     return $this->hasMany('Project', 'client_id'); 
    } 
} 

Irgendwelche Ideen, wie dies funktioniert? Ich habe eine Zeit lang mein Kopf wurde Kratzen - beachten Sie auch eine Datenbank Beziehung pro Ich bin nicht so die einfachere die Erklärung desto besser :)

+0

an meinen Code überprüfen würde es mir scheinen, dass Ihre Aufgaben Tisch in einer many-to-many-Beziehung eine Pivot-Tabelle ist. Sie sollten wahrscheinlich die Methode "objectsToMany()" von Eloquent verwenden, um Client und Benutzer direkt zu verknüpfen. In [this] (http://laravel.com/docs/eloquent#working-with-pivot-tables) finden Sie Informationen zum Hinzufügen weiterer Felder zu Ihrer Pivot-Tabelle. – ciruvan

+0

Hi @cuewizchris Ich habe mir die Dokumentation angeschaut und kann nicht herausfinden, wie ich ihr Beispiel von User/Role/Pivot auf meine Bedürfnisse übersetze. Willst du sagen, ich sollte meine hasMany() zu toMany() ändern? Ich bin hier ein bisschen verloren. – Josh

Antwort

2

Ich habe gerade damit gearbeitet und einiges selbst gelernt. Was ich getan habe, war eine viele zu viele Beziehung zwischen users und clients eingerichtet und erstellt eine Pivot-Tabelle für die Behandlung der Beziehung namens tasks, die auch die Beschreibung für jede Aufgabe speichert.

Es war zu viel zu geben, aber Sie können http://paste.laravel.com/Fpv

+0

Absolut genial. Danke, das ist genau das, wonach ich gesucht habe. Allerdings (und ich gebe zu, das ist nicht der Rahmen meiner Frage) - es wird sehr kompliziert/bricht, wenn Sie versuchen, Paginierung und/oder OrderBy (zB Auftrag von created_at DESC) Anweisungen zu Ihrem eloquenten Abfrage in Ihrem Controller :) offensichtlich mit der orderBy created_at versucht, das Erstelldatum des Benutzers und nicht das Erstellungsdatum der Aufgabe zu ermitteln. – Josh

+0

Ich habe ein paar Dinge versucht, aber es scheint immer zu versagen, wenn ich versuche, paginate oder OrderBy beim eifrigen Laden. Ich nehme an, der beste Weg, dies zu tun wäre, array_slice für paginate zu verwenden und welche sortierende Funktion für Sie passend wäre. – user1669496

+6

Es ist nie "zu viel, um hier zu tippen". Ich kann deine Verbindung nicht auflösen. – DutGRIFF

0

Many-to-many-Beziehungen wie diese mit Eloquent getan werden kann:

class User extends Eloquent implements UserInterface, RemindableInterface { 
    public function client() 
    { 
     return $this->belongsToMany('Client', 'tasks', 'client_id')->withPivot('description'); 
    } 
} 

und die inverse Beziehung ...

class Client extends Eloquent { 
    public function users() 
    { 
     return $this->belongsToMany('User', 'tasks', 'user_id'); 
    } 
} 

habe nicht getestet, aber es sollte korrekt sein.

+0

Ich entschuldige mich für meinen Mangel an Wissen und die Anzahl der Fragen, aber wie würde meine eloquente Abfrage in meinem Controller aussehen? – Josh

Verwandte Themen