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) 表中,我有一个非常重要的列,名为“已装备”。

我有一个表格,用户可以在其中装备、取消装备和投掷物品。此表单有一个带有数据透视表 (user_items) 表行 ID 的隐藏字段。因此,当用户尝试装备物品时,系统会检查该物品是否可装备。

所以,我想要一个带有数据透视表数据和项目数据的对象,基于数据透视表中的 item_id,我可以发送到处理程序(处理所有逻辑的地方)。

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

像这样的东西(不起作用):

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

这可能吗?

4

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 在内部使用“项目”作为键,因此可能会干扰。
  2. 无论您在“get()”之前放置什么方法都是数据库查询的一部分。“get()”之后的所有内容都由 PHP 在对象上处理。在大多数情况下,后者会更慢。
于 2013-06-05T14:09:43.033 回答