gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:28:18 25 4
gpt4 key购买 nike

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

用户可以通过以下场景访问表单:

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

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

    表格政策:

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

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

    FormPolicy@view

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

    虽然上述方法有效,但它是性能瓶颈。

    从我可以看到我的以下选项是:
  • FormPolicy 过滤器(当前方法)
  • 查询所有权限(5)并合并成单个集合
  • 查询所有权限的所有标识符 (5),然后使用 IN() 语句中的标识符查询 Form 模型

  • 我的问题:

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

    最佳答案

    我希望做一个 SQL 查询,因为它的性能比 php 好得多

    像这样的东西:

    User::where('id', $request->user()->id)
    ->join('group_users', 'user.id', 'group_users.user_id')
    ->join('team_users', 'user.id', 'team_users.user_id',)
    ->join('form_owners as user_form_owners', function ($join) {
    $join->on('users.id', 'form_owners.owner_id')
    ->where('form_owners.owner_type', User::class);
    })
    ->join('form_owners as group_form_owners', function ($join) {
    $join->on('group_users.group_id', 'form_owners.owner_id')
    ->where('form_owners.owner_type', Group::class);
    })
    ->join('form_owners as team_form_owners', function ($join) {
    $join->on('team_users.team_id', 'form_owners.owner_id')
    ->where('form_owners.owner_type', Team::class);
    })
    ->join('forms', function($join) {
    $join->on('forms.id', 'user_form_owners.form_id')
    ->orOn('forms.id', 'group_form_owners.form_id')
    ->orOn('forms.id', 'team_form_owners.form_id');
    })
    ->selectRaw('forms.*')
    ->get();

    从我的头顶和未经测试的角度来看,这应该会为您提供用户、他的组和这个团队拥有的所有表单。

    但是,它不会查看组和团队中用户查看表单的权限。

    我不确定您是如何为此设置身份验证的,因此您需要为此修改查询以及数据库结构中的任何差异。

    关于laravel - 在 Laravel 中过滤权限时的最佳性能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58441900/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com