2013-05-14 2 views
10

У меня есть три таблицы: пользователи, элементы и user_items. Пользователь имеет много элементов, а элемент принадлежит многим пользователям.Laravel 4 eloquent сводная таблица

Таблицы:

Users 
id 
username 
password 

Items 
id 
name 
equipable 

User_items 
id 
user_id 
item_id 
equipped 

моделей:

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

В сводной таблице (user_items) Я очень важный столбец с именем "оборудован".

У меня есть форма, где пользователи могут экипировать, снимать и бросать предметы. Эта форма имеет скрытое поле с идентификатором строки таблицы (user_items). Таким образом, когда пользователь пытается оснастить элемент, система проверяет, является ли элемент экипированным.

Итак, я хочу, чтобы объект со сводными данными и данными элемента, на основе item_id из сводной таблицы, я могу отправить обработчику (где обрабатывается вся логика).

Так что мне нужно сначала получить доступ к сводной таблице, а затем получить доступ к таблице элементов.

Что-то вроде этого (не работает):

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

Возможно ли это сделать?

ответ

22

Вы должны сначала включить «equipable» на сводном вызова:

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

Тогда вы можете спросить Eloquent если ваш деталь equipable или нет:

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

Держите две вещи:

  1. Eloquent использует «предметы» в качестве ключа внутри, чтобы он мог вмешиваться.
  2. Независимо от того, какой метод вы поставили перед тем, как «get()» является частью запроса db. Все после «get()» обрабатывается PHP на объекте. Последний в большинстве случаев будет медленнее.
+2

Спасибо! Это помогло мне - через 2 часа ударило головой из-за стола. –

+0

для получения дополнительной информации см. Http://laravel.com/docs/eloquent#working-with-pivot-tables –

+0

:) Yay! взял меня на некоторое время, чтобы понять, что я забыл «-> поворот». +1 – rofavadeka