如何验证两列的唯一性,其中一列在laravel中可以为null



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是一个可为null的布尔值,因为如果我将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检查电话号码,因为有一条这样的记录,它抛出了验证失败的异常。我该如何缓解这种情况。

在这里找到了一个帖子,但它和我在问题中发布的内容相同。

使用Laravel 6和Mysql 8

这里是

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

检查不为null就足够了,因为active的可能值只有1和null

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

相关内容

  • 没有找到相关文章

最新更新