小编Tim*_*Tim的帖子

在Laravel中过滤权限时的最佳性能方法

我正在开发一个应用程序,在该应用程序中,用户可以通过许多不同的场景访问许多表单。当我向用户返回表单索引时,我试图构建具有最佳性能的方法。

用户可以通过以下方案访问表单:

  • 拥有表格
  • 团队拥有表格
  • 拥有拥有表单的组的权限
  • 拥有拥有表单的团队的权限
  • 有权使用表格

如您所见,用户可以使用5种可能的方式来访问表单。我的问题是如何最有效地将一系列可访问的表单返回给用户。

表格政策:

我试图从模型中获取所有表单,然后通过表单策略过滤表单。这似乎是一个性能问题,因为在每次过滤器迭代中,表单都会通过一个contains()雄辩的方法传递5次,如下所示。数据库中的表单越多,意味着它变得越慢。

FormController@index

public function index(Request $request)
{
   $forms = Form::all()
      ->filter(function($form) use ($request) {
         return $request->user()->can('view',$form);
   });
}

Run Code Online (Sandbox Code Playgroud)
FormPolicy@view

public function view(User $user, Form $form)
{
   return $user->forms->contains($form) ||
      $user->team->forms->contains($form) ||
      $user->permissible->groups->forms($contains);
}
Run Code Online (Sandbox Code Playgroud)

尽管以上方法有效,但它是性能瓶颈。

从我可以看到的以下选项中:

  • FormPolicy过滤器(当前方法)
  • 查询所有权限(5)并合并到单个集合中
  • 查询所有权限的所有标识符(5),然后使用IN()语句中的标识符查询Form模型

我的问题:

哪种方法可以提供最佳性能,还有其他选择可以提供更好的性能吗?

laravel eloquent

9
推荐指数
1
解决办法
217
查看次数

标签 统计

eloquent ×1

laravel ×1