2013-05-14 83 views
10

我有三个表:用户,项目和user_items。用户拥有多个项目,并且项目属于多个用户。Laravel 4雄辩枢轴表

的表格:

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)表我命名 “配备” 一个非常重要的列。

我有一个表单,用户可以装备,解开和扔物品。该表单具有隐藏字段,其中包含pivot(user_items)表格行ID。因此,当用户试图装备物品时,系统会检查物品是否可用。因此,我想要一个基于来自数据透视表的item_id的透视数据和项目数据的对象,我可以发送到处理程序(处理所有逻辑)。

所以我要做的是首先访问数据透视表,然后访问项目表。

这样的事情(不工作):

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

这是可能的吗?

回答

22

你首先必须包括“equipable在您的枢纽电话:

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

然后,你可以问雄辩,如果你的产品equipable与否:

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

保持两两件事:

  1. 雄辩使用'项目'作为内部的关键,以便可能会干扰。
  2. 无论您在“get()”之前放置什么方法都是数据库查询的一部分。 “get()”之后的所有内容都由PHP在Object上处理。后者在大多数情况下会比较慢。
+2

谢谢!这对我帮助很大 - 在2个小时后把我的头从桌子上敲了出来。 –

+0

有关更多详细信息,请参阅http://laravel.com/docs/eloquent#working-with-pivot-tables –

+0

:)耶!花了我一段时间才意识到我忘了“ - >枢轴”。 +1 – rofavadeka