为啥我的模型在关系子查询中看不到 spatie 权限特征方法?

Posted

技术标签:

【中文标题】为啥我的模型在关系子查询中看不到 spatie 权限特征方法?【英文标题】:Why my model can't see spatie permissions trait method on relationship subquery?为什么我的模型在关系子查询中看不到 spatie 权限特征方法? 【发布时间】:2020-01-13 05:41:51 【问题描述】:

我在我的 laravel 项目中使用 spatie/laravel-permissions composer 包。 当我运行这个查询时:

$jobs = Job::whereIn('id', $ids)->whereHas('user', function ($query) 
    $query->hasRole('company');
)->get();

返回错误信息

调用未定义的方法 Illuminate\Database\Eloquent\Builder::hasRole()

我该如何解决我的问题?

【问题讨论】:

您传递的是查询生成器实例而不是记录,dd($user) 在查询之前查看 发布你声明 $user 的代码 这里 var $user 没有被声明为变量。这是Builder 对象 你怎么看,我必须如何重写我的代码才能获得具有公司角色的用户的工作? 发布 Builder 对象代码 【参考方案1】:

因为传递给函数闭包的$user 是一个查询构建器实例,而不是User 模型的实例,所以在上面声明$user 的地方,请确保获得一个实例

$user = User::where(......, ........)->first(); // Without first() it's a query builder
$jobs = Job::whereIn('id', $ids)->whereHas('user', function ($user) 
    $user->hasRole('company');
)->get();

【讨论】:

【参考方案2】:

hasRole-method 不是作用域,不能用于 Builder 实例。

我认为您应该能够在您的应用程序中使用role-scope。

$jobs = Job::whereIn('id', $ids)->whereHas('user', function ($q) 
    return $q->role('company');
)->get();

【讨论】:

以上是关于为啥我的模型在关系子查询中看不到 spatie 权限特征方法?的主要内容,如果未能解决你的问题,请参考以下文章

我在我的列表中看不到广告商(多点连接),为啥?

为啥我在 XCode 项目中看不到我的构建阶段选项卡?

为啥我在我的页面中看不到不同的 li 标记?

为啥 QListView 中看不到文件图标?

部署Expo项目时为啥在试飞中看不到内部测试选项

为啥我在 osgi 控制台中看不到任何帮助?