2013-05-14 54 views
10

Ho tre tabelle: utenti, articoli e user_items. Un utente ha molti articoli e un oggetto appartiene a molti utenti.Laravel 4 eloquente tabella pivot

Le tabelle:

Users 
id 
username 
password 

Items 
id 
name 
equipable 

User_items 
id 
user_id 
item_id 
equipped 

I modelli:

class User extends Eloquent { 
    public function items() 
    { 
     return $this->belongsToMany('Item', 'user_items') 
        ->withPivot('equipped'); 
    } 
} 

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

nel perno (user_items) tavolo Ho una colonna molto importante denominata "attrezzato".

Ho un modulo in cui gli utenti possono equipaggiare, disequipaggiare e lanciare oggetti. Questo modulo ha un campo nascosto con l'ID della riga della tabella pivot (user_items). Quindi, quando un utente tenta di equipaggiare un oggetto, il sistema controlla se l'articolo è equipabile.

Quindi, voglio un oggetto con i dati pivot e i dati dell'elemento, in base a item_id dalla tabella pivot, posso inviare al gestore (dove viene gestita tutta la logica).

Quindi, quello che devo fare è prima accedere alla tabella pivot e quindi accedere alla tabella degli articoli.

Qualcosa di simile (non funziona):

$item = User::find(1)->items->pivot->find(1); 

Questo è possibile fare?

risposta

22

Prima devi includere 'equipaggiabile' sulla vostra chiamata pivot:

return $this->belongsToMany('User', 'user_items') 
      ->withPivot('equipable'); 

allora si può chiedere Eloquente se il vostro articolo è equipaggiabile o no:

$item = User::with('items')->get()->find(1)->items->find(2)->pivot->equipable; 

Tenere a mente due cose:

  1. Eloquent utilizza 'elementi' come chiave internamente, in modo che possa interferire.
  2. Qualsiasi metodo tu abbia prima di "get()" fa parte della query db. Tutto dopo "get()" viene gestito da PHP sull'oggetto. Quest'ultimo sarà più lento nella maggior parte dei casi.
+2

Grazie! Questo mi ha aiutato - dopo 2 ore sbattendo la testa dalla scrivania. –

+0

per maggiori dettagli fare riferimento a http://laravel.com/docs/eloquent#working-with-pivot-tables –

+0

:) Yay! mi ci è voluto un po 'per capire che ho dimenticato "-> pivot". +1 – rofavadeka

Problemi correlati