有没有办法在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();
}
答案 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
我没有测试它,但它应该帮助你前进并做出必要的调整。