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)设置的唯一周期时间的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3 验证唯一

护照身份验证在 laravel 5.3 中不起作用

Laravel 5.3 自定义验证消息数组

Laravel 5.3 和 VueJS 2 身份验证

如何使用 Laravel Passport (5.3) 记录身份验证尝试

在 Laravel 5.3 中使用多个身份验证?