Laravel 4的Eloquent透视表

10

我有三张表:users(用户),items(物品)和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');
    }
}
在数据透视表(user_items)中,有一个非常重要的名为“equipped”的列。
我有一个表单,用户可以在其中装备、脱下和丢弃物品。这个表单有一个带有数据透视表(user_items)行 ID 的隐藏字段。因此,当用户尝试装备物品时,系统会检查该物品是否可装备。
因此,我想要一个包含数据透视表数据和物品数据的对象,基于数据透视表中的item_id,我可以将其发送到处理程序(处理所有逻辑)中。
所以,我需要先访问数据透视表,然后再访问物品表。
类似这样(不起作用):
$item = User::find(1)->items->pivot->find(1);

这可行吗?

1个回答

22

你首先需要在枢轴调用中包含“equipable”:

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

然后你可以询问Eloquent你的物品是否可装备:

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

记住这两点:

  1. Eloquent在内部使用“items”作为键,因此可能会干扰。
  2. 放在“get()”之前的任何方法都是数据库查询的一部分。在“get()”之后的所有内容都由PHP在对象上处理。后者在大多数情况下会更慢。

2
谢谢!这真的帮了我,让我在桌子前撞了两个小时的头。 - Marko Aleksić
请参考http://laravel.com/docs/eloquent#working-with-pivot-tables,了解有关处理交叉表的详细信息。 - Loonb
太棒了!我花了一段时间才意识到我忘了“->pivot”。+1 - rofavadeka
这让我免去了为我的数据透视表创建模型的麻烦。 - Ayobami Opeyemi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接