在 laravel 中加入 indexQuery 和 filter apply

问题描述 投票:0回答:1

我有自定义索引查询

$resourceTable = 'soft';
$user = Auth::user();

$orderBy = $request->get('orderBy');
$dir = $request->get('orderByDirection');

$query->select(DB::raw("{$resourceTable}.*"));

if (!$user->isGlobalAdmin) {
    $roles = json_decode($user->getRoleNames());
    $rolesArray = [];
    foreach ($roles as $roleName) {
        $role = json_decode(Role::findByName($roleName));
        $rolesArray[] = $role->id;
    }

    $query->join('model_has_roles', 'model_id', '=', "{$resourceTable}.id")
        ->where('model_type', '=', 'App\Models\Soft')
        ->whereIn('role_id', $rolesArray);
}

当我加载资源sql的索引页时

select soft.* from `soft` 
inner join `model_has_roles` on `model_id` = `soft`.`id` 
where `model_type` = 'App\\Models\\Soft' and `role_id` in (2, 3)

我有角色过滤器。

申请代码是

$roles = $value;
$rolesArray = [];
foreach ($roles as $roleName) {
    $role = json_decode(Role::findByName($roleName));
    $rolesArray[] = $role->id;
}

return $query->whereIn('role_id', $rolesArray);

当我在过滤器中设置一个时,我得到了 sql

select soft.* from `soft` 
inner join `model_has_roles` on `model_id` = `soft`.`id` 
where `role_id` in (3) and `model_type` = App\\Models\\Soft and `role_id` in (2, 3)

2次role_id IN,如何改成只有一次?

laravel laravel-query-builder laravel-nova
1个回答
0
投票

通过确保每个role_id都在第一个或第二个数组中

$rolesArray
查询时:
$query->whereIn('role_id', $rolesArray);
并删除两个查询语句之一

© www.soinside.com 2019 - 2024. All rights reserved.