Laravel 5.3 验证:由两列(start_date,end_date)设置的唯一周期时间
Posted
技术标签:
【中文标题】Laravel 5.3 验证:由两列(start_date,end_date)设置的唯一周期时间【英文标题】:Laravel 5.3 Validation: Unique period time which is set by two column (start_date, end_date) 【发布时间】:2017-05-11 11:41:05 【问题描述】:有什么方法可以验证由两列(start_date、end_date)设置的唯一周期时间吗?请让我知道这是否可以使用 Laravel 5.3 验证器。
谢谢 阿维
【问题讨论】:
这些列是谁设置的?这些列是从哪里设置的? 它们来自数据库表。 那么您希望差异是独一无二的吗?你能粘贴一些你正在使用的代码或测试用例吗 【参考方案1】:据我所知,没有办法在 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
【讨论】:
以上是关于Laravel 5.3 验证:由两列(start_date,end_date)设置的唯一周期时间的主要内容,如果未能解决你的问题,请参考以下文章