【问题标题】:how to ignore array ID for validating array in Laravel?如何忽略数组 ID 以在 Laravel 中验证数组?
【发布时间】:2019-10-23 09:56:45
【问题描述】:

我想对数组值进行验证,这是我的代码:

我有一个函数可以使用 hasMany 对另一个表进行查询,但我想验证该查询必须是唯一的。我尝试使用这个"required|unique:deed_legalization_numbers, number",这是可行的,但是当我尝试更新/编辑某些字段时,它会返回已经使用

然后我尝试忽略唯一的 ID:

"required|unique:deed_legalization_numbers, number, [$request->input('deed_legalization_numbers')]"

它将返回数组到字符串的转换,因为不支持数组

然后我尝试了这段代码:

$deed_legalization_numbers = $request->input('deed_legalization_numbers.*.number');
$deed_legalization_id = $request->input('deed_legalization_numbers.*.id');


$rules = [
    'deed_legalization_numbers.*.number' => //'required|unique:deed_legalization_numbers,number,deed_legalization_numbers.*.id',
    [
        'required',
        Rule::unique('deed_legalization_numbers')->where(function ($query) use ($deed_legalization_numbers, $deed_legalization_id) {
            return $query->whereIn('number', $deed_legalization_numbers);
        })->ignore($deed_legalization_id[0]) // The problem in this line
    ],
];

$validator = Validator::make($request->all(), $rules);

if ($validator->fails()) {
    return redirect()->back()
        ->withErrors($validator)
        ->withInput();
}

如果我将变量 $deed_legalization_id[0] 更改为 $deed_legalization_id,我想从检查中忽略 deed_legalization_numbers ID 它会返回错误:

状态码:500 内部服务器错误

Symfony\Component\Debug\Exception\FatalErrorException:方法 Illuminate\Validation\Rules\Unique::__toString() 不能抛出异常,捕获 ErrorException:addslashes() 期望参数 1 是字符串,在文件中给出的数组。 .path\vendor\laravel\framework\src\Illuminate\Validation\ValidationRuleParser.php 在第 233 行

0 {主}

【问题讨论】:

    标签: php mysql laravel laravel-6


    【解决方案1】:

    搜索了这么多线程,然后我找到了解决问题的方法

    所以,我只是改变这个

    $deed_legalization_id = $request->input('deed_legalization_numbers.*.id');
    
    $rules = [
        'deed_legalization_numbers.*.number' => //'required|unique:deed_legalization_numbers,number',
        [
            'required',
            'distinct',
            Rule::unique('deed_legalization_numbers', 'number')->where(function ($query) use ($deed_legalization_id) {
                $query->whereNotIn('id', $deed_legalization_id);
                return $query;
            })
        ],
    ];
    
    $validator = Validator::make($request->all(), $rules, $message);
    
    if ($validator->fails()) {
        return redirect()->back()
            ->withErrors($validator)
            ->withInput();
    }
    

    一切都很好,不再有重复的 column_number 并且必须是唯一的

    【讨论】:

      【解决方案2】:

      您的自我回答很有帮助。不确定 2 年前是否存在,但有 an undocumented helper method called whereNotIn() 允许您跳过回调内容。所以我会为你的情况这样做:

      $deed_legalization_id = $request->input('deed_legalization_numbers.*.id');
      
      $rules = [
          'deed_legalization_numbers.*.number' => [
              'required',
              'distinct',
              Rule::unique('deed_legalization_numbers', 'number')
                  ->whereNotIn('id', $deed_legalization_id),
          ],
      ];
      
      

      这会导致相同的数据库查询:

      select count(*) as aggregate from `deed_legalization_numbers` where `number` = ? and (`id` not in (?));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 2021-07-02
        • 2018-07-26
        • 2014-08-26
        • 2017-10-16
        相关资源
        最近更新 更多