据我所知,没有办法在 Laravel 上完成如此复杂的自定义规则。我知道你真的想做这样的事情:
//////////////////////////////////////////////////
// This is not working code. just an idea !!!
//
$data['period'] = $data['start_date'] . "-" . $data['end_date'];
$validator = Validator::make($data, [
'period' => Rule::unique('projects', DB::raw('concat(start_date, "-", end_date)')),
], [
'period' => 'Period is duplicated.',
]);
但是Larvel不接受这种规则(其实我很好奇他们为什么不接受这种做法)
所以你有两个选择。
解决方案 1. 在数据库中创建一个视图,该视图将具有由 concat(start_date,"-",end_date) 创建的附加列“period”。
然后编写如下代码。
$data['period'] = $data['start_date'] . "-" . $data['end_date'];
$validator = Validator::make($data, [
'period' => Rule::unique('projects', DB::raw('concat(start_date, "-", end_date)')),
], [
'period' => 'Period is duplicated.',
]);
if ($validator->fails()) {
// do some thing
} else {
unset($data['period']); // When adding or update, 'period' will cause error because period is only in view, not in table itself
// do insert or update
}
解决方案 2. 除了唯一性检查外,只需通过正常验证即可,所有验证完成后,您可以通过手动在表中搜索来检查自己。
如下:
if (Project::where(DB::raw("concat(start_date, '-', end_date)"), "=", $data['start_date'] . "-" . $data['end_date'])->count() > 0) {
// now this is not unique, so do something
}