Laravel 4 eixo pivotante eloquente

Eu tenho três tabelas: usuários, itens e user_items. Um usuário tem muitos itens e um item pertence a muitos usuários.

As mesas:

Users id username password Items id name equipable User_items id user_id item_id equipped 

Os modelos:

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

Na tabela pivô (user_items) eu tenho uma coluna muito importante chamada “equipada”.

Eu tenho um formulário onde os usuários podem equipar, desarmar e jogar itens. Este formulário tem um campo oculto com o ID da linha da tabela do pivô (user_items). Então, quando um usuário tenta equipar um item, o sistema verifica se o item está equipado.

Então, eu quero um object com os dados de pivô e os dados do item, com base no item_id da tabela dinâmica, eu posso enviar para o manipulador (onde toda a lógica é tratada).

Então, o que devo fazer é acessar primeiro a tabela dinâmica e acessar a tabela de itens.

Algo assim (não funciona):

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

Isso é possível?

Você primeiro deve include ‘equipable’ em sua chamada de pivô:

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

Então, você pode perguntar o Eloquent se seu item estiver equipado ou não:

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

Tenha em mente duas coisas:

  1. Eloquent usa “itens” como uma chave internamente, para que isso possa interferir.
  2. Seja qual for o método que você colocar antes de “get ()” faz parte da consulta db. Tudo depois de “get ()” é tratado pelo PHP no object. O último será mais lento na maioria dos casos.