Laravel 4 красноречивый опорный стол

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

Таблицы:

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

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

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

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

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

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

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

Можно ли это сделать?

Ответ 1

Сначала вы должны включить "equipable" в свой сводный вызов:

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

Затем вы можете спросить Eloquent, если ваш предмет экипирован или нет:

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

Помните о двух вещах:

  • Eloquent использует "элементы" как ключ внутри, так что это может мешать.
  • Какой бы метод вы ни использовали, прежде чем "get()" является частью запроса db. Все после "get()" обрабатывается PHP на объекте. В большинстве случаев последний будет медленнее.