2017-03-02 24 views
1

有没有办法在Laravel中建立一个验证来检查表中的两列是否唯一?因此,例如如果在我的表中有[(A,B)],那么输入(A,A)或(B,B)应该通过验证,但(A,B)必须再次失败。在Laravel中加入两列的验证规则

例如像这样:

DB::table('mytable') 
      ->where([ 
       ['col1', $item->col1], 
       ['col2', $item->col2] 
      ]) 
      ->exists(); 

但我想验证内做到这一点,那么东西simular这样:

public function validate() { 
     return Validator::make($this->attributes, [ 
      'col1|col2' => 'unique:mytable', 
      //.... 
     ])->errors(); 
    } 

回答

2

如果您正在寻找复合索引(多列)的唯一性验证,除非你创建一个自定义的验证规则,这是不可能的。

您可以创建自定义的验证规则,请参见https://laravel.com/docs/validation#custom-validation-rules

// Example: 
// 'col1' => 'unique_with:table,col2,col3,col4,etc' 
// 'col2' => doesn't need to check uniqueness again, because we did it for col1 

Validator::extend('unique_with', function ($attribute, $value, $parameters, $validator) { 
    $request = request()->all(); 

    // $table is always the first parameter 
    // You can extend it to use dots in order to specify: connection.database.table 
    $table = array_shift($parameters); 

    // Add current column to the $clauses array 
    $clauses = [ 
    $attribute => $value, 
    ]; 

    // Add the rest 
    foreach ($parameters as $column) { 
    if (isset($request[$column])) { 
     $clauses[$column] = $request[$column]; 
    } 
    } 

    // Query for existence. 
    return ! DB::table($table) 
      ->where($clauses) 
      ->exists(); 
}); 

的地方,在一个服务提供商的boot()方法的代码,你可以使用App\Http\Providers\AppServiceProvider.php 我没有测试它,但它应该帮助你前进并做出必要的调整。

0

我想你要找的是要求他们如果存在,但要确保两者都是唯一的。这应该为你工作:

'col1' => 'unique:mytable|required_with:col2', 
'col2' => 'unique:mytable|required_with:col1' 
+0

这不是OP所要求的。这个问题明确指出:“是否有一种方法可以在Laravel中构建验证,以检查表中的两列是否是唯一的?”。他在谈论复合指数。目前不可能,只有自定义验证规则。 – Frondor

+1

@Frondor有时很难直接辨别出某人在问什么。这个特殊的答案似乎最适合OP提供的例子。如果这不是OP想要的,那么他们可以自由地将我陷入湮没。 – Ohgodwhy