2013-05-14 10 views
10

Ich habe drei Tabellen: Benutzer, Elemente und user_items. Ein Benutzer hat viele Elemente und ein Element gehört vielen Benutzern.Laravel 4 eloquent Pivot-Tabelle

Die Tabellen:

Users 
id 
username 
password 

Items 
id 
name 
equipable 

User_items 
id 
user_id 
item_id 
equipped 

Die Modelle:

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

Im Pivot (user_items) Tabelle habe ich eine sehr wichtige Säule "ausgestattet" genannt.

Ich habe ein Formular, wo Benutzer Gegenstände ausstatten, unquip und werfen können. Dieses Formular enthält ein ausgeblendetes Feld mit der Tabellenzeilen-ID pivot (user_items). Wenn ein Benutzer versucht, einen Gegenstand auszustatten, prüft das System, ob der Gegenstand ausrüstbar ist.

Also, ich möchte ein Objekt mit den Pivot-Daten und die Daten, basierend auf item_id aus der Pivot-Tabelle, kann ich an den Handler senden (wo alle Logik behandelt wird).

Also was ich tun muss, ist zuerst auf die Pivot-Tabelle zuzugreifen und dann auf die Artikeltabelle zuzugreifen.

Etwas Ähnliches (nicht funktioniert):

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

Ist das möglich zu tun?

Antwort

22

Sie müssen zuerst 'equipable' auf Pivot-Aufruf sind:

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

Dann können Sie Eloquent fragen, ob Ihr Artikel ausrüstbar ist oder nicht:

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

Halten Sie zwei Dinge beachten:

  1. Eloquent verwendet "Elemente" als Schlüssel intern, so dass sie stören könnten.
  2. Welche Methode Sie vor "get()" setzen, ist Teil der DB-Abfrage. Alles nach "get()" wird von PHP auf dem Objekt behandelt. Letzteres wird in den meisten Fällen langsamer sein.
+2

Vielen Dank! Das half mir - nach 2 Stunden schlug ich meinen Kopf vom Schreibtisch. –

+0

für weitere Details beziehen Sie sich auf http://laravel.com/docs/eloquent#working-with-pivot-tables –

+0

:) Yay! brauchte eine Weile um zu erkennen, dass ich "-> Pivot" vergessen habe. +1 – rofavadeka