Laravel中的验证规则用于连接两列

时间:2017-03-02 00:36:15

标签: php laravel validation laravel-5 laravel-4

有没有办法在Laravel中构建验证,检查表中两列是否唯一?

例如,如果我的表中有[(A,B)],则输入(A,A)或(B,B)应通过验证,但(A,B)必须再次失败。 / p>

例如:

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

但是我想在验证中做到这一点,所以这类似于:

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

2 个答案:

答案 0 :(得分:0)

我认为你要找的是要求它们存在,但要确保两者都是唯一的。这应该适合你:

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

答案 1 :(得分:0)

如果您正在寻找复合索引(多列)唯一性的验证,除非您创建自定义验证规则,否则无法做到这一点。

您可以创建自定义验证规则,请参阅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 我没有测试它,但它应该帮助你前进并做出必要的调整。