例如,我有两个表:sites1
和sites2
我需要检查来自我的html表单的字段url
是否唯一。
这是我的验证规则:
public function rules()
{
return [
'url' => unique:sites1|unique:sites2'
];
}
不幸的是,此规则仅适用于sites2
表。有没有可能的方法来验证这两个表?
答案 0 :(得分:7)
您的验证规则似乎没问题。只需确保sites1
和sites2
表的字段名称url
都在同一个数据库中。
您的unique:sites1
规则将被翻译为SQL
select count(*) as aggregate from `sites1` where `url` = ?
虽然unique:sites2
规则将被翻译为SQL
select count(*) as aggregate from `sites2` where `url` = ?
查看第一个SQL是否返回结果。如果使用有限的索引长度,长URL可能会导致非唯一。如果您可以存储URL的哈希值,那么您可以更好地使用哈希来比较URL。
答案 1 :(得分:5)
无需在两个不同的表中保持相同的名称
在laravel 4.2中
Validator::make(Input::all, [
'url' => 'unique:site1,your_column_name|unique:site2:your_column_name_2'
]);
Laravel 5. *:
$this->validate($request,[
'url' => 'unique:site1,your_column_name|unique:site2:your_column_name_2'
]);
希望它工作正常。
答案 2 :(得分:0)
在上面的答案中,我认为您不能使用自定义错误消息,您可以通过另一种方式进行操作,只需将归档的文件复制到另一个字段中即可。
public function validator(array $data)
{
$data = ['url2' => $data['email']];
$rules = [
'url' => 'unique:sites1',
'url2' => 'unique:sites2',
];
$messages = [
'url.unique' => 'url unique in site 1',
'url2.unique' => 'url unique in site 2',
];
return $validator = Validator::make($data, $rules, $messages);
}
if ($validator->fails()) {
if(!empty($validator->errors()->get('url2'))) {
$validator->errors()->add("url", 'url unique in site 2');
}
}