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 | |
+--------------------------+---------------------+------+-----+---------+----------------+
字段phone
和active
具有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');
})
],