Reputation: 45
Is there any way to validate the unique period times which is set by two column (start_date, end_date)? Please let me know if this is possible by using Laravel 5.3 validator.
Thanks Arvi
Upvotes: 0
Views: 338
Reputation: 3189
So far as I know there is no way to accomplish such complex custom rules on Laravel. I understand that you really wanna do some thing like this:
//////////////////////////////////////////////////
// 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.',
]);
But Larvel does not accept this kind of rule (actually I am wondering why they do not accept this kind of approach)
So you have 2 options.
Solution 1. Create a view in the database, which will have additional column "period" which is made by concat(start_date,"-",end_date). And then make the code like following.
$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
}
Solution 2. Just pass normal validation except for the unique checking, after all validation done, you do checking yourself by searching in the table manually. Like following:
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
}
Upvotes: 1