Php 如何从laravel验证器的exists规则中获取现有数据库行?
如何获取通过Php 如何从laravel验证器的exists规则中获取现有数据库行?,php,laravel,laravel-validation,Php,Laravel,Laravel Validation,如何获取通过验证器的exists规则找到的值 $validator = Validator::make($request->all(), [ 'invite' => 'required|max:30|exists:invites,code', ]); 我不想对数据库发出第二个请求,它已经由验证器完成了 Invite::where('code', $value) 那是不可能的。exists语句返回布尔值。这就是规则存在的功能 在我看来,在这里您可以做的最好的事情是从验证器中
验证器的exists
规则找到的值
$validator = Validator::make($request->all(), [
'invite' => 'required|max:30|exists:invites,code',
]);
我不想对数据库发出第二个请求,它已经由验证器完成了
Invite::where('code', $value)
那是不可能的。exists
语句返回布尔值。这就是规则存在的功能
在我看来,在这里您可以做的最好的事情是从验证器中删除exists
规则,并且在验证通过之后,您查询invite。如果返回null
,则手动处理abort()
Zend framework将行存储在验证器中,我希望laravel也会这样做。@shukshin.ivan即使它可以存储值,规则的sql查询也会返回布尔值。您始终可以从服务提供商处创建自己的验证规则,但我建议改用我编写的方法。查询在哪里创建?没有在validator codecan中找到它。您可以帮助查找负责创建查询的代码吗?@shukshin.ivan您可以看到查询是如何内置的(浏览回购协议),但这不是您应该解决此问题的方式。有时,我们通过过早的优化使事情变得过于复杂。如果您仍然关心这个问题,我可以帮助您编写自定义验证规则(这不会比我上面提供的示例更好)。
$validator = Validator::make($request->all(), [
'invite' => 'required|max:30',
]);
if ($validator->fails()) {
return redirect('some/route')
->withErrors($validator)
->withInput();
}
// now check for existance
else if (! $invite = Invite::where('code', $request->code)->first()) {
return abort(404, 'Invitation not found');
}
$invite->someMethod();