Php Laravel表单请求:如何避免n+;1验证阵列时的查询?

Php Laravel表单请求:如何避免n+;1验证阵列时的查询?,php,laravel,Php,Laravel,我想知道验证大量元素数组时的最佳方法 比如说, <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Request; class UsersRolesAssignmentRequest extends FormRequest { public function r

我想知道验证大量元素数组时的最佳方法

比如说,

    <?php
   
    namespace App\Http\Requests;

    use Illuminate\Foundation\Http\FormRequest;
    use Illuminate\Http\Request;
    
    class UsersRolesAssignmentRequest extends FormRequest
    {
        public function rules(Request $request)
        {
            return [
                'roles' => 'array|min:1',
                'roles.*.role_id' => 'required|exists:roles',
                'roles.*.user_id' => 'required|exists:users'
            ];
        }
    }

我不确定它是否对DB进行了200次检查,这似乎是一个相当大的疏忽。但是,如果是,您可以使用()中的
in
规则以及一些预取的结果:

公共功能规则(请求$Request){
$roleIds=Role::pull('id')->内爆(',');
$userIds=User::pull('id')->内爆(',');
返回[
“角色”=>“数组|最小值:1”,
'roles.*.role_id'=>“{$roleIds}中的必填项”,
'roles.*.user_id'=>“必需|在:{$userIds}”
];
}
只是别忘了通过
使用App\Models\User导入您的模型
使用App\Models\Role
(或模型所在的任何路径)

此规则将生成以下内容:

'roles.*.role_id' => 'required|in:1,2,3,4,5', // ... 
'roles.*.user_id' => 'required|in:1,2,3,4,5

我也不确定,我已经尝试过您的解决方案,但我认为在大型数据库中,这将导致一些问题。谢谢你的回答!验证完成之前和之后,您可以通过
DB::enableQueryLog()
进行双重检查。这将显示已运行的查询,包括
exists
检查。如果运行了200多个查询,那么这是一个N+1疏忽,但是如果只运行了少数查询,那么您就很好了。是的,对于大型数据库,这种方法可能会有一些性能问题。我已经测试过了,确实存在n+1问题。您只需对模型执行一个where(),并对用户输入和where查询结果执行一个数组_diff?这样,我将无法显示正确的错误消息。您可能是,您可以像验证程序一样为输入发送自定义错误消息。您可以在数组diff中找到不存在的id