2013-07-31 12 views
9

Używam Laravel 4, aw szczególności szukam odpowiedzi, która używa elokwentnej ORM.Laravel: zwracanie wyników z wielu powiązanych tabel przy użyciu wymownej metody:

Mam tabeli "zadania", które pojemnikom CLIENT_ID a USER_ID przypisany do każdego wiersza.

CLIENT_ID odnosi się do klienta na „klientów” stół i USER_ID odnosi się do użytkownika na „użytkowników” tabeli.

Co chcę zrobić: pokaż wszystkie zadania i wyświetli „klientównazwa i „użytkownikówfirst_name

więc wynik będzie wyglądać w moim (ostrzem) widok:

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

powyższy pogląd wypluwa $ zadaniowego> client-> nazwa idealnie w porządku, ale niestety pokazuje „T uszenie uzyskać własność non-object”po dodaniu linii $ zadaniowego> user-> first_name

Mój kontroler wygląda następująco:

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

Jak rozumiem moje modele zrobić różnicę też więc moje modele wyglądać następująco:

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'); 
    } 
} 

I:

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

I:

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

Jakieś pomysły na to, jak to działa? Byłem zarysowania głowę na chwilę - również pamiętać, że nie jestem w bazie związek pro więc prostsze wyjaśnienie, tym lepiej :)

+0

Wydaje mi się, że tabela jest tabelą zadania pivot w wiele do wielu relacji. Powinieneś prawdopodobnie użyć metody belongsToMany() metody Eloquent do bezpośredniego połączenia klienta i użytkownika. Zobacz [to] (http://laravel.com/docs/eloquent#working-with-pivot-tables), aby dowiedzieć się, jak dodać dodatkowe pola do tabeli przestawnej. – ciruvan

+0

Hi @cuewizchris Zerknąłem na dokumentację i nie mogę się dowiedzieć, jak przetłumaczyć ich przykład User/Role/Pivot na moje potrzeby. Mówisz, że powinienem zmienić moje hasMany() na ToMany()? Jestem trochę zagubiony. – Josh

Odpowiedz

2

Właśnie przez to przejrzałem i sam nauczyłem się kilku rzeczy. To, co zrobiłem, to skonfigurowanie wielu do wielu relacji między users i clients i utworzono tabelę przestawną do obsługi relacji o nazwie tasks, która również przechowuje opis dla każdego zadania.

Było tu zbyt wiele do pisania, ale można sprawdzić mój kod na http://paste.laravel.com/Fpv

+0

Absolutnie geniusz. Dziękuję, to jest dokładnie to, czego szukałem. Jednak (i ​​przyznaję, że to wykracza poza zakres mojego pytania) - robi się naprawdę skomplikowane/zrywa, gdy próbujesz dodać instrukcje paginacji i/lub orderBy (np. Order by created_at DESC) do wymownej kwerendy w kontrolerze :) oczywiście z orderBy created_at próbuje pobrać datę create_at użytkownika, a nie datę created_at zadania. – Josh

+0

Próbowałem kilka rzeczy, ale zawsze wydaje się, że nie powiedzie się, gdy próbuję do paginacji lub orderBy, gdy chętny do ładowania. Zakładam, że najlepszym sposobem na zrobienie tego byłoby użycie array_slice do paginacji i jakakolwiek funkcja sortowania byłaby dla ciebie odpowiednia. – user1669496

+6

To nigdy nie jest "za dużo do wpisania tutaj". Nie mogę rozwiązać Twojego linku. – DutGRIFF

0

wiele-do-wielu można zrobić tak z wymowny:

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

i relacja odwrotna ...

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

nie testowałem, ale powinno być prawidłowe.

+0

Przepraszam za brak wiedzy i liczbę pytań, ale jak wyglądałoby moje wymowne zapytanie w moim kontrolerze? – Josh

Powiązane problemy