2013-05-14 14 views
10

Mam trzy tabele: użytkownicy, przedmioty i user_items. Użytkownik ma wiele przedmiotów, a przedmiot należy do wielu użytkowników.Laravel 4 elokwentny stół obrotowy

Tabele:

Users 
id 
username 
password 

Items 
id 
name 
equipable 

User_items 
id 
user_id 
item_id 
equipped 

modelach:

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

W (user_items) tabeli przestawnej mam bardzo ważną kolumnę o nazwie "wyposażona".

Mam formularz, w którym użytkownicy mogą wyposażyć, usunąć i wrzucić przedmioty. Ten formularz zawiera ukryte pole z identyfikatorem wiersza tabeli przestawnej (user_items). Tak więc, gdy użytkownik próbuje wyposażyć przedmiot, system sprawdza, czy przedmiot jest odpowiedni.

Tak więc chcę obiektu z danych przestawnych i danych pozycji, w oparciu o item_id z tabeli przestawnej, mogę wysłać do obsługi (gdzie jest obsługiwana cała logika).

To, co muszę zrobić, to najpierw uzyskać dostęp do tabeli przestawnej, a następnie uzyskać dostęp do tabeli przedmiotów.

Coś takiego (nie działa):

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

Czy jest to możliwe do zrobienia?

Odpowiedz

22

najpierw muszą zawierać „equipable” na rozmowy obrotu:

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

Następnie można zapytać Eloquent jeśli przesyłka jest equipable czy nie:

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

zachować dwie rzeczy na uwadze:

  1. Eonquent używa "przedmiotów" jako klucza wewnętrznie, co może przeszkadzać.
  2. Niezależnie od tego, jaką metodę umieścisz przed "get()" jest częścią zapytania db. Wszystko po "get()" jest obsługiwane przez PHP w Object. Ten ostatni będzie w większości przypadków wolniejszy.
+2

Dziękujemy! Pomogło mi to - po 2 godzinach uderzania głową w biurko. –

+0

po więcej szczegółów zobacz http://laravel.com/docs/eloquent#working-with-pivot-tables –

+0

:) Yay! zajęło mi trochę czasu, aby uświadomić sobie, że zapomniałem "-> pivot". +1 – rofavadeka