雄辩 - 呼唤未定义的关系

时间:2017-05-30 10:02:17

标签: php laravel eloquent many-to-many relationship

我有一个用户表和一个权限表。这是一个多对多的关系,所以我还有一个 users_permissions 表,其中包含 user_id & module_permission_id 列。

用户模型具有以下关系:

public function permissions()
{
    return $this->belongsToMany(Permission::class, 'users_permissions', 'user_id', 'module_permission_id');
}

当我运行查询时,结果包含一个空权限数组。

User::with('permissions');

如果我在with中回显查询,我会收到错误:在模型[App \ Models \ User]上调用未定义的关系[]

User::with(['permissions', function($q) {
            echo $q->toSql();  
            die();
        }]);

查询的其余部分有效,它只是试图获得失败的权限。

3 个答案:

答案 0 :(得分:4)

在我的情况下,这是与camelCase vs. snake_case有关的编码约定问题: 在模型中有

public function getPermissions()

在查询中有

User::with(['get_permissions'])

当我将其更改为

User::with(['getPermissions'])

它开始工作,尽管我想说Laravel的方法是改用snake_case。

这让我感到困惑了几天,因为Symfony和AngularJs之类的框架有一个混合的约定,即您需要在snake_case中编写参数的地方以及camelCase中的其他地方。我没有在Laravel网站上找到任何文档,他们如何处理此问题,因此我尝试了Straight Way,在这里似乎是这样:)

答案 1 :(得分:1)

也许你刚刚忘记了用户:: with('权限') - > get()之后的> get()?

https://laravel.com/docs/5.0/eloquent#eager-loading

答案 2 :(得分:1)

在此为可能尝试从选择列的急切加载重构为具有范围查询的急切加载的任何人。

您必须将列的选择移动到范围查询中,尝试使用通常的冒号表示法选择列将失败并抛出未定义的关系错误。

例如,从选择数据透视表列和权限表 User:with('permissions:permission_tag:tag_set_id,permission_name') 中的一列的急切加载到选择相同列但也对结果进行排序的范围查询

  User::with([
    'permissions' => function ($query) {
      $query->select('permission_tag:tag_set_id', 'permission_name');
      $query->orderBy('permission_name');
    },
  ]);

注意我去掉了 : 符号,它就在作用域查询中。