【问题标题】:How to validate two column unique where one column is nullable in in laravel如何验证两列是否唯一,其中一列在 laravel 中可为空
【发布时间】:2020-08-01 15:11:13
【问题描述】:

我有一个agents 表的以下数据库表结构

+--------------------------+---------------------+------+-----+---------+----------------+
| Field                    | Type                | Null | Key | Default | Extra          |
+--------------------------+---------------------+------+-----+---------+----------------+
| id                       | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| first_name               | varchar(255)        | NO   |     | NULL    |                |
| phone                    | varchar(255)        | NO   | MUL | NULL    |                |
| active                   | tinyint(1)          | YES  |     | NULL    |                |
+--------------------------+---------------------+------+-----+---------+----------------+

phoneactive 字段具有 2 列唯一约束,这意味着一次只有一个 phone 应处于活动状态。 active 列是一个可为空的布尔值,因为如果我将 0 设置为 falsy 值,那么如果有两个非活动的 phone 数字,则 2 列唯一约束将失败(因为 null != null 它在当我手动将其插入数据库时​​的数据库级别)。我希望我在这里很清楚。

问题

我正在尝试为此功能设置验证规则。因此,在创建代理时,如果有任何active 电话号码,则验证应该失败,否则,应该插入记录。

这是我的验证规则

$request->validate([
   'first_name'=> 'required',
   'active' => 'required',
   'phone' => [
       'required', 
       Rule::unique('delivery_agents')->using(function ($query) use ($request) {
             $query->where('phone', $request->phone)
                 ->where('active', $request->active ? $request->active : null); // explicitly checking against null value or true not 0
       })
    ],
 ]);

但是当有一个非活动电话号码时验证规则失败(即:phone 号码与active = null

我相信原因是验证规则会检查带有active = null 的电话号码,并且由于有一条这样的记录,它会引发验证失败异常。我该如何缓解这种情况。

找到了here 的帖子,但这与我在问题中发布的内容相同。

使用 Laravel 6 和 Mysql 8

【问题讨论】:

    标签: php mysql laravel validation


    【解决方案1】:

    给你

    $request->validate([
       'first_name'=> 'required',
       'active' => 'required',
       'phone' => [
           'required', 
           Rule::unique('delivery_agents')->using(function ($query) use ($request) {
                 $query->where('phone', $request->phone)
                     ->where(function ($query) {
                          $query->where('active', 1)
                                ->orWhereNull('active');
    }); 
           })
        ],
     ]);
    

    【讨论】:

    • 对我不起作用,结果相同,可以有多个非活动电话号码
    • 你为什么不检查活动?
    • 你是什么意思?
    • 你能解释清楚一点应该预期的输入和输出吗?
    【解决方案2】:

    检查 not null 就足够了,因为您只有 1 和 NULL 作为 active 的可能值

    'phone' => [
        'required', 
        Rule::unique('delivery_agents')->where(function ($query) use ($request) {
             return $query->where('phone', $request->phone)
                   ->whereNotNull('active'); 
        })
    ],
    

    【讨论】:

    • 确实尝试删除return 可能吗?
    • 还是没有运气。让我深入研究 Rule 类来解决这个问题
    猜你喜欢
    • 2020-04-18
    • 2013-08-30
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多