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