【发布时间】:2018-04-30 06:51:54
【问题描述】:
由于 Laravel 默认的 unique:tablename 验证规则只允许两列;在多于两列是唯一的情况下,它直接将QueryException 与SQLSTATE errorcode 23000 一起抛出。作为临时解决方法,我正在捕获异常并发出如下警告:
try{
//My query that might throw an exception for a duplicate entry
} catch (\Exception $e){
return $e->getCode() == 23000 ?
redirect()->back()->with('warning','Duplicate entry') :
redirect()->back()->with('error','Unknown Error Occurred');
}
问题是,对于错误代码不是 23000 的所有其他情况,我只会看到错误消息 Unknown Error Occurred 而不是 Whoops。显然,调试将是一场噩梦。
所以我寻找替代品。我必须选择以下两个选项之一:a) 使用 third party package 或者,b) 创建 custom validation rule
我选择了选项 b。但我正在为如何自己建造一个而苦苦挣扎。当我查看一个示例时(对于一次性内联规则):
$validator = Validator::make($request->all(), [
'title' => [
'required',
'max:255',
function($attribute, $value, $fail) {
if ($value === 'foo') {
return $fail($attribute.' is invalid.');
}
},
],
]);
...我意识到该规则只能应用于单个属性和值。但我有 4 个属性和值来检查它们是否确实是唯一条目。我该怎么做?
【问题讨论】:
-
试试after-validation-hook。检查后验证挂钩中所有 4 个字段的唯一性。
-
好的,我正在尝试。但是
somethingElseIsInvalid()方法是占位符方法还是真的有目的?在 API 文档中找不到它。 -
你想如何实现唯一规则?能举个例子吗?
-
类似
multicolumnunique:tablename,column1,column2,column3,column4 -
那么你可以使用多个唯一规则。喜欢,
unique:table1,column1|unique:table1,field2|unique:table1,field3。或者在验证后挂钩中,您必须在somethingElseIsInvalid()的位置实现 4 个字段的唯一性逻辑