2014-10-31 71 views
4

我正在使用Laravel 4.2和mysql db。
我考試表格中,我正在考試條目和字段 - >
id | examdate | batch | chapter | totalmarks如何在Laravel 4中添加組合的唯一字段驗證器規則

我已在架構構建使用
$table->unique(array('examdate','batch','chapter'));組合唯一的密鑰。
現在我想添加一個驗證規則。我知道我可以通過laravel unique validator rule添加獨特的驗證,但問題是,它只檢查一個字段。
我希望它爲3個字段組合添加唯一性(用戶不能添加具有相同的考試日期,批次和章節值組合的第二行)。

它甚至可以在laravel 4中執行它。如果它不可行,是否有任何解決方法?

回答

9

您可以編寫自定義驗證程序規則。該規則可能是這個樣子:

'unique_multiple:table,field1,field2,field3,...,fieldN' 

該代碼會是這個樣子:

Validator::extend('unique_multiple', function ($attribute, $value, $parameters) 
{ 
    // Get table name from first parameter 
    $table = array_shift($parameters); 

    // Build the query 
    $query = DB::table($table); 

    // Add the field conditions 
    foreach ($parameters as $i => $field) 
     $query->where($field, $value[$i]); 

    // Validation result will be false if any rows match the combination 
    return ($query->count() == 0); 
}); 

,只要你喜歡的狀態,您可以使用盡可能多的領域,只要保證值傳遞是一個包含字段值的數組,其順序與驗證規則中聲明的順序相同。所以你的驗證代碼看起來是這樣的:

$validator = Validator::make(
    // Validator data goes here 
    array(
     'unique_fields' => array('examdate_value', 'batch_value', 'chapter_value') 
    ), 
    // Validator rules go here 
    array(
     'unique_fields' => 'unique_multiple:exams,examdate,batch,chapter' 
    ) 
); 
+0

這是很棒的+1。我將把這個課程放在laravel 5.1中? – 2015-07-27 22:44:40

+0

@MikeA查看[自定義驗證規則文檔](http://laravel.com/docs/5.1/validation#custom-validation-rules)。 – Bogdan 2015-07-28 00:22:10

0

它沒有爲我工作,所以我調整了一點代碼。

Validator::extend('unique_multiple', function ($attribute, $value, $parameters, $validator) 
{ 
    // Get the other fields 
    $fields = $validator->getData(); 

    // Get table name from first parameter 
    $table = array_shift($parameters); 

    // Build the query 
    $query = DB::table($table); 

    // Add the field conditions 
    foreach ($parameters as $i => $field) { 
     $query->where($field, $fields[$field]); 
    } 

    // Validation result will be false if any rows match the combination 
    return ($query->count() == 0); 
}); 

驗證器看起來像這樣。如其他答案中所述,您不需要特定的數據庫表列名稱順序。

$validator = Validator::make($request->all(), [ 
     'attributeName' => 'unique_multiple:tableName,field[1],field[2],....,field[n]' 
    ],[ 
     'unique_multiple' => 'This combination already exists.' 
    ]);