【发布时间】:2021-07-10 14:25:55
【问题描述】:
我有那个项目的订单有状态,每个状态都可以看到,这取决于用户是否有权管理它。我尝试使用自定义集合,但缺点是默认情况下它不可分页, 这是代码
class OrdersCollection extends Collection
{
public function allowedForUser(User $user)
{
return $this->filter(function ($order) use ($user) {
return $user->can(sprintf('manage %s orders', strtolower($order->status)));
});
}
}
这是我尝试使用它的方式
$orders = Order::withoutTrashed()
->allowedForUser(Auth::user())
->paginate(50);
编辑:
为了避免过滤表中的 20k+ 行,我想出了这个自定义构建器
class OrderBuilder extends Builder
{
public function WhereAllowedForUser(User $user)
{
$permissions = $user->permissions()
->where('name', 'like', 'manage % orders')
->pluck('name')
->map(function ($item) {
return str_replace('manage ', '', str_replace(' orders', '', $item));
});
return $this->whereIn('status', $permissions);
}
}
【问题讨论】:
-
那么,问题出在哪里?它不是可分页的?
-
是的,它不能分页,如果我使用上面的代码进行分页,我会得到
Call to undefined method Illuminate\Database\Eloquent\Builder::allowedForUser() -
是的,那是因为你还在
Builder,不是收藏。我认为一个好的方法是创建一个范围查询并传递您需要的数据,然后根据您的需要过滤(在数据库上)。 -
我可以使用任何代码示例吗?我试图提取权限名称,然后使用 whereIn,但是例如名为“管理拒绝订单”的权限,订单状态被拒绝。我找不到干净的方法。
-
Order 是一个模型,既然可以将 allowedForUser 放在模型类中,为什么还要扩展一个集合呢?然后过滤get()值