2013-07-31 14 views
9

Sto utilizzando Laravel 4 e in particolare sto cercando una risposta che usi l'ORM eloquente.Laravel: restituire i risultati da più tabelle correlate utilizzando l'eloquente

Ho una tabella "compiti" quali contenitori un client_id e user_id assegnato a ogni riga.

client_id si riferisce ad un cliente su una "clienti" tavolo e user_id si riferisce a un utente su un "utenti" tavolo.

Quello che voglio fare: mostra tutte le attività e visualizzare i "clienti" nome e "utenti" first_name

Così il risultato sarebbe simile a questa nel mio (lama) vista:

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

la vista sopra sputa fuori la task-> client-> nome $ perfettamente bene, ma purtroppo mostra un "T rying per ottenere la proprietà di non-oggetto" quando aggiungo la linea $ task-> user-> first_name

mio regolatore di simile a questa:

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

quanto ho capito i miei modelli fare la differenza anche, così i miei modelli simile a questa:

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

E:

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

E:

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

Qualche idea su come farlo funzionare? Mi sono grattato la testa per un po '- nota anche che non sono un rapporto di database pro quindi più semplice è la spiegazione, meglio è :)

+0

Sarebbe mi sembra che la tabella Tasks è una tabella pivot in una relazione molti-a-molti. Probabilmente dovresti usare il metodo appartieneToMany() di Eloquent per collegare direttamente Client e User. Vedi [this] (http://laravel.com/docs/eloquent#working-with-pivot-tables) per informazioni su come aggiungere ulteriori campi alla tabella pivot. – ciruvan

+0

Ciao @cuewizchris Ho dato un'occhiata alla documentazione e non riesco a capire come tradurre il loro esempio di Utente/Ruolo/Pivot in base alle mie esigenze. Stai dicendo che dovrei cambiare my hasMany() a toMany()? Sono un po 'perso qui. – Josh

risposta

2

Ho solo lavorato su questo e ho imparato un bel po 'di cose. Quello che ho fatto è stato impostare una relazione molti a molti tra users e clients e creato una tabella pivot per gestire la relazione denominata tasks che memorizza anche la descrizione per ogni attività.

era troppo a digitare qui, ma è possibile controllare il mio codice a http://paste.laravel.com/Fpv

+0

Assolutamente geniale. Grazie, questo è esattamente quello che stavo cercando. Comunque (e ammetto che questo va oltre lo scopo della mia domanda) - diventa davvero complicato/interrompe quando provi ad aggiungere le impaginazioni e/o le istruzioni orderBy (ad esempio order by created_at DESC) alla tua query eloquente nel tuo controller :) ovviamente con orderBy created_at sta cercando di ottenere la data created_at dell'utente non data created_at dell'attività. – Josh

+0

Ho provato un po 'di cose, ma sembra sempre fallire quando provo a impaginare o ordinare da un caricamento avido. Sto assumendo che il modo migliore per farlo sarebbe usare array_slice per paginate e qualunque funzione di ordinamento sarebbe appropriata per te. – user1669496

+6

Non è mai "troppo da scrivere qui". Non riesco a risolvere il tuo link. – DutGRIFF

0

Le relazioni molti-a-molti possono essere eseguite in questo modo con Eloquent:

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

e la relazione inversa ...

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

non ho ancora testato questo, ma dovrebbe essere corretto.

+0

Mi scuso per la mia mancanza di conoscenza e il numero di domande, ma quale sarebbe la mia interrogativa eloquente nel mio controller? – Josh

Problemi correlati