【问题标题】:Laravel 5 multiple table unique validationLaravel 5 多表唯一验证
【发布时间】:2016-05-31 19:34:06
【问题描述】:

例如,我有 2 个表:sites1sites2

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

这是我的验证规则:

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

很遗憾,此规则仅适用于sites2 表。是否有任何可能的方法来验证这两个表?

【问题讨论】:

标签: php validation laravel-5


【解决方案1】:

在上面的答案中,我认为您不能使用自定义错误消息,您可以通过另一种方式将文件复制到另一个字段中以进行两次检查。

 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');
                }
   }

【讨论】:

    【解决方案2】:

    您的验证规则似乎没问题。只需确保 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。

    【讨论】:

    • 如果URL是数组数据类型的请求,你能给我任何建议或例子吗?我该怎么办。
    • @Dipen 在这种情况下,您需要创建自定义验证规则。
    【解决方案3】:

    无需在两个不同的表中保持相同的名称

    在 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'
    ]);
    

    希望一切正常。

    【讨论】:

    • 我不知道为什么,但是当在 site2 之后使用冒号(:) 进行唯一验证时,我会出现 SQLSTATE[42S02]: Base table or view not found: 1146 Table 'soft.users:email' doesn't exist 错误。但是使用逗号效果很好......
    • 请检查您的第二个表的列名是否是电子邮件。
    • 用逗号替换第二个冒号就可以了,unique:site2:your_column_name_2 => unique:site2,your_column_name_2
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2014-08-08
    • 2018-10-25
    • 1970-01-01
    • 2017-10-11
    • 2021-04-28
    相关资源
    最近更新 更多