Laravel 5多表独特验证

时间:2016-02-19 09:27:51

标签: php validation laravel-5

例如,我有两个表:sites1sites2

我需要检查来自我的html表单的字段url是否唯一。

这是我的验证规则:

public function rules()
    {
        return [
            'url' => unique:sites1|unique:sites2'
        ];
    }

不幸的是,此规则仅适用于sites2表。有没有可能的方法来验证这两个表?

3 个答案:

答案 0 :(得分:7)

您的验证规则似乎没问题。只需确保sites1sites2表的字段名称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');
                }
   }