2016-12-27 24 views
0

是否有任何方法來驗證由兩列(start_date,end_date)設置的唯一週期時間?請通過使用Laravel 5.3驗證器讓我知道這是否可能。Laravel 5.3驗證:由兩列設置的唯一週期時間(start_date,end_date)

感謝 ARVI

+0

誰設置了這些列?這些列在哪裏設置? – anwerj

+0

它們來自數據庫表。 –

+0

所以你想要區別是獨一無二的?你可以粘貼一些你正在使用的代碼或測試用例 – anwerj

回答

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不接受這樣的規則

所以,你必須2個選項。

解決方案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 
}