Laravel控制器移除PingtreeGroup全局作用域报错问题排查
问题原因及解决方法
你遇到的错误是因为withoutGlobalScope()方法必须传入参数,不能空调用。这个方法需要明确指定要移除的全局作用域,要么是作用域的类名,要么是你定义作用域时的名称标识。
具体解决方式分三种情况:
1. 移除单个自定义作用域类
如果你的全局作用域是通过自定义类(比如PingtreeGroupScope)实现的,直接传入类名即可:
$pingtreeGroup = $pingtreeGroup->withoutGlobalScope(PingtreeGroupScope::class)->load([ 'pingtree_group_entries', 'pingtree_group_entries.pingtree' => function ($query) { $query->withCount('pingtree_entries'); }, 'pingtree_group_entries.pingtree.pingtree_entries', 'pingtree_group_entries.pingtree.pingtree_entries.buyer_tier', 'pingtree_group_entries.pingtree.pingtree_entries.buyer_tier.buyer', ])->loadCount('pingtree_group_entries');
2. 移除指定名称的全局作用域
如果是在PingtreeGroup模型里用addGlobalScope时指定了名称(例如:addGlobalScope('active', function ($query) { ... })),就传这个名称字符串:
$pingtreeGroup = $pingtreeGroup->withoutGlobalScope('active')->load([ 'pingtree_group_entries', 'pingtree_group_entries.pingtree' => function ($query) { $query->withCount('pingtree_entries'); }, 'pingtree_group_entries.pingtree.pingtree_entries', 'pingtree_group_entries.pingtree.pingtree_entries.buyer_tier', 'pingtree_group_entries.pingtree.pingtree_entries.buyer_tier.buyer', ])->loadCount('pingtree_group_entries');
3. 移除所有全局作用域
如果需要一次性移除所有全局作用域,使用复数形式的withoutGlobalScopes()(注意末尾加s):
$pingtreeGroup = $pingtreeGroup->withoutGlobalScopes()->load([ 'pingtree_group_entries', 'pingtree_group_entries.pingtree' => function ($query) { $query->withCount('pingtree_entries'); }, 'pingtree_group_entries.pingtree.pingtree_entries', 'pingtree_group_entries.pingtree.pingtree_entries.buyer_tier', 'pingtree_group_entries.pingtree.pingtree_entries.buyer_tier.buyer', ])->loadCount('pingtree_group_entries');
额外注意点
因为你这里用了路由模型绑定,传入的$pingtreeGroup实例已经是经过全局作用域筛选后的结果。如果想从数据库重新获取不带全局作用域的完整数据,应该直接使用模型的查询构造器重新查询:
$pingtreeGroup = PingtreeGroup::withoutGlobalScope(PingtreeGroupScope::class) ->findOrFail($pingtreeGroup->id) ->load([ 'pingtree_group_entries', 'pingtree_group_entries.pingtree' => function ($query) { $query->withCount('pingtree_entries'); }, 'pingtree_group_entries.pingtree.pingtree_entries', 'pingtree_group_entries.pingtree.pingtree_entries.buyer_tier', 'pingtree_group_entries.pingtree.pingtree_entries.buyer_tier.buyer', ]) ->loadCount('pingtree_group_entries');
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

