【问题标题】:Laravel Validator exists or equal to / conditonal orLaravel 验证存在或等于 / 有条件的或
【发布时间】:2019-09-13 03:41:11
【问题描述】:

我有一个输入值,它可以是数据库中存在的实际 ID,也可以是表示特殊情况的 0。

在任何情况下,如果这个值是非空的,我需要用类似的东西来验证它

Validator::make($data, [
    'item_id.*' => 'required|in:0[OR]exists:items_table,id',
]);

问题是我没有找到任何有关如何执行此操作的文档[OR]。我设法找到的几乎所有内容都与针对其他键的测试或针对没有存在“或”的显式数组检查 just 相关。

注意:这是 不是 required_if/unless 的情况,因为我需要检查当前测试的值,而不是针对其他键。

注意2:此页面:https://laravel.com/docs/5.8/validation 不提供答案

【问题讨论】:

  • 您需要一个自定义验证器。

标签: php laravel validation laravel-5 laravel-validation


【解决方案1】:

您可以轻松地为该变量编写自己的验证规则。像这样的:

if (!empty($data->item_id)){
    if($data->item_id<>0 || $data->item_id <not in list of values>){
          return Redirect::back()->withErrors('error messages here')->withInput();
    }
}

【讨论】:

  • 我试图避免使用非 laravel 代码以获得更好的可维护性,当然我可以在纯 PHP 中自己进行验证:)
  • 我绝对理解使用 Laravel 框架的魅力;它通常看起来是最优雅的解决方案和“正确”的方法。但有时使用纯 PHP 会更快。 :-) 就可维护性而言,纯 PHP 更稳定,不太可能快速更改语法,而您可能必须在升级 Laravel 时经常更新 Validator:: 语法。
  • 它只是在初始创建时刻更快,通过可维护性我的意思是代码传递给未来的编辑器,当你开始混合 2 种方法时,未来的快速传递会变慢。所以不是没有人在谈论“正确”的方式,而是故意谈论“Laravel”的方式:)但是我同意你的观点,只是在这种情况下不是。
【解决方案2】:

不创建新验证器的一种可能性是在检查之前创建一个数组。 这不是最好的方法,而是工作。 例如:

public function rules() {
    // here you create an array with all data
    $items = ItemsTabe::select('id')->pluck('id')->toArray();
    $allItems = '0,' . implode(',', $items);
    $allItems = explode(',', $allItems);
    return [
        'item_id' => [
            'required',
        ],
        'item_id.*' => [
            Rule::in($allItems),
        ],
    ];
}

【讨论】:

  • 好主意,但你的前 3 行有点乱。 $allItems = Items::pluck('id'); $allItems[] = 0; 怎么样
猜你喜欢
  • 2020-06-03
  • 2017-05-11
  • 2018-11-11
  • 2016-06-18
  • 1970-01-01
  • 2015-05-12
  • 2021-07-22
  • 1970-01-01
相关资源
最近更新 更多