我应该如何为Laravel中的多个中间表构建Eloquent ORM模型?

时间:2013-01-09 21:47:23

标签: php orm laravel eloquent

我无法在任何地方找到有关如何使用您的Eloquent ORM模型的多个中间表的信息。我面临的问题是我有一个表用于我的用户,权限和角色。这些是4个表格:

权限:

id
name

Permission_roles:

id
name

Permission_role_mappings:

id
permission_id
permission_role_id

Permission_role_user_mappings:

id
permission_role_id
user_id

(好吧,我也有一个users表,但由于外键位于permission_role_user_mapping,因此它的布局无关紧要。)

所以问题是我希望能够在从User模型调用时从permissions表中获取数据。我在使用Eloquent ORM完全掌握工作流程时遇到了一些麻烦,所以如果我遗漏了一些关键的基础知识,那么请指出它。

根据documentation,似乎我不需要为中间表创建模型。那么我如何从User类中指定关系呢?我可以做类似的事吗?

class User extends Eloquent {

    public function permission_role()
    {
        return $this->has_many_and_belongs_to('Permission_Role', 'permission_role_user_mappings');
    }

    public function permission()
    {
        return $this->has_many_and_belongs_to('Permission_Role', 'permission_role_user_mappings')->has_many_and_belongs_to('Permission','permission_role_mappings');
    }
}

这似乎不起作用,这是错误:

User::find(1)->first()->permission()->first();
...
Method [permission] is not defined on the Query class.

我还希望能够从Permission_Role和Permission开始获取数据。我希望答案可以帮助我指定所需的所有模型。

1 个答案:

答案 0 :(得分:2)

Eloquent关系作为对象属性而不是函数来访问。

User::find(1)->first()->permission;

您可以在dd函数中包含上述语句以查看它。

guide on Eloquent Relationships应该有用

在评论中编辑问题,选择角色中的所有权限:

$roles = array();
$permission_roles = User::find(1)->permission_roles()->get();
foreach ($permission_roles as $pr) {
  if (! in_array($pr->permissions)) {
    $roles[] = $pr->permissions;
  }
}

这会让你得到你想要的。但是,这最终会进行大量查询。最好在这里使用Eager Loading