【问题标题】:Multiple Open and Close Time array validation in Laravel?Laravel中的多个打开和关闭时间数组验证?
【发布时间】:2016-11-17 22:15:38
【问题描述】:

我有一组开放时间和关闭时间。

输入如下所示:

 <input type="text" name="time[1][open]">
 <input type="text" name="time[1][close]">
 <input type="text" name="time[x][open]">
 <input type="text" name="time[x][close]">

这是来自dd($request-&gt;all())的转储

array:2 [
  "days" => array:2 [
    0 => "1" // Mon
    1 => "2" // Tue
  ]
  "time" => array:2 [
    1 => array:2 [
      "open" => "09:00"
      "close" => "11:30"
    ]
    2 => array:2 [
      "open" => "16:00"
      "close" => "21:00"
    ]
  ]
]

使用 Laravel 请求验证 - 如何在打开和关闭时间之间循环进行验证以确保它不会与 mysql 数据库中的现有记录重叠?例如,我们可能在数据库中有 Open:14:00 - Close:19:00 但用户请求了 "open" =&gt; "16:00""close" =&gt; "21:00" - 所以验证不应该通过。

更新:

times 表中的示例结果,一天可以有多个打开/关闭时间。

id   |   day    |   open_time  |   close_time
-----------------------------------------------
1    |    1     |   13:30:00   |    15:00:00
2    |    2     |   16:30:00   |    20:00:00
3    |    3     |   09:30:00   |    14:30:00
4    |    3     |   18:00:00   |    22:00:00
-----------------------------------------------

您可以看到 times.id=2 (16:30:00 - 20:00:00) 和用户请求 "open" =&gt; "16:00""close" =&gt; "21:00" 之间存在重叠。验证不应通过。

【问题讨论】:

  • 如果您可以描述“检查”,请自己编写验证器 :),如果您需要详细指导,请在此处制作。
  • @Kyslik 我需要有关如何每天循环(days 字段)然后验证time 数组的详细指导。它需要检查数据库。
  • 您能否为有问题的表提供迁移?您是否知道如何自己检查(不要担心“验证器代码”)只是尝试编写伪代码,假设您有一个像您演示的输入,并且您已经从数据库加载了数据,您能编写返回真/假的函数?
  • @Kyslik 我已经更新了问题 - 不用担心时间比较,我自己可以做到。问题更多是通过用户请求的循环,然后检查数据库。
  • 你想写一个可重用的验证规则,还是只是“简单地”检查请求(正如你提到的)。

标签: php laravel laravel-5


【解决方案1】:

这不是一个完整的答案,但它可能对 OP 有所帮助。我仍然不明白天/时间等之间的关系。这是没有需要实现逻辑的样板


首先创建新的提供者(用于自定义验证规则)

$ php artisan make:provider ValidatorServiceProvider

并在 config/app.php 中注册

    ...
    App\Providers\RouteServiceProvider::class,
    App\Providers\ValidatorServiceProvider::class,
    ...

为新的验证规则创建新文件夹/文件:

$ mkdir ./app/Validators
$ touch ./app/Validators/OverlappingTimeValidator.php

并在新的验证器规则中放入一些代码(由于我没有完全理解问题,所以无法弄清楚逻辑,也许我缺乏理解它的语言能力)

<?php

namespace App\Validators;

class OverlappingTimeValidator
{
    public function validate($attribute, $value, $parameters, $validator)
    {
        //make sure you have valid time format (for each time[])
        //make sure open < close for each pair
        //compare each set of open-close times with each other
        //connect to database and get all required data from $parameters[0] table
        //to connect to database and get data use \DB::table($parameters[0])->get(); follow this https://laravel.com/docs/5.3/queries#retrieving-results
        //array_get($validator->getData(), $parameters[1], null); // gives you days user picked or null
        dd($attribute, $value, $parameters, $validator);
        return false; //in case validation fails
        return true; //in case validation passes
    }
}

运行 $ composer dump-autoload 以便自动加载新文件

在ValidatorServiceProvider.php中注册验证规则

public function boot()
{
    Validator::extend('overlapping_time', 'App\Validators\OverlappingTimeValidator@validate');
}

最后,*Request 中的规则应如下所示:

public function rules()
{
    return [
        'time' => 'overlapping_time:table_name,days'
    ];
}

您可以使用'time.*' 并且验证将分别针对您可能不想要的每次运行!所以使用'time' 并在整个时间数组上进行验证。

据我了解,days 是验证时间的相关属性,因此我将其添加为参数,但您可以更改它。请查看dd()OverlappingTimeValidator@validate 中的输出。

为了添加错误信息打开./resources/lang/en/validation.php并添加(接近底部,真的没关系):

'overlapping_time' => 'The :attribute...',

【讨论】:

    【解决方案2】:

    你可以试试

     'time.*.open' => 'required',
     'time.*.close' => 'after:time.*.open',
    

    参考这个链接

    https://laravel.com/docs/5.3/validation#validating-arrays

    【讨论】:

    • 这不包括检查数据库中的打开时间和关闭时间 - 以确保它不重叠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    相关资源
    最近更新 更多