首页 文章

Laravel 4雄辩的透视台

提问于
浏览
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');
    }
}

在pivot(user_items)表中,我有一个非常重要的列“配备” .

我有一个用户可以装备,取消装备和扔物品的表格 . 此表单有一个隐藏字段,其中包含pivot(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;
    

    牢记两件事:

    • Eloquent在内部使用'items'作为键,因此可能会干扰 .

    • 在"get()"之前放置的任何方法都是db查询的一部分 . "get()"之后的所有内容都由对象上的PHP处理 . 在大多数情况下,后者会更慢 .

相关问题