我正在尝试使用 Rule::unique('table')->where(function($query) use($x) {...});
检查(a)列是否唯一。功能,但是当我将其传递到验证器时,我收到一个奇怪的错误。我认为正在发生的情况是,它试图检查我提供的语句中的值是否相等,但它还检查它认为是表的唯一 ID 列的列,但事实并非如此,因此它正在破坏。
protected function validator(array $data)
{
$uid = 660000000;
$rule = Rule::unique('member_record')->where(function ($query) use ($uid) {
return $query->where('uniqueID', $uid);
});
return Validator::make($data, [
'fullName' => ['required', 'string', 'min:2'],
'member_id' => [
'bail', 'required', 'Numeric', $rule,
'exists:new_benefits_member,member_id'
],
'email' => ['bail', 'required', 'email', 'confirmed', 'unique:user,email'],
'password' => [
'required', 'string', 'min:8', 'confirmed',
'regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{8,}$/'
],
'terms' => ['required']
]);
}
但是,我收到了如下所示的错误。
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'member_id' in 'where clause' (SQL: select count(*) as aggregate from
member_record
wheremember_id
= 660000000 and (uniqueID
= 660000000))
我唯一的假设是,当我将数据传递到 Validator::make($data...
时它试图将 $rule 与 $data 数组进行比较,但它搞砸了。如果您有任何我可以尝试的修复方法,请告诉我。
最佳答案
这里的问题是 Rule::unique() 函数可以采用 2 个参数,如下所示
public static function unique($table, $column = 'NULL')
{
return new Rules\Unique($table, $column);
}
如果列保留为“NULL”,那么这将默认为验证器中键的名称::make($x, [] <--- array
如本例所示。
protected function validator(array $data)
{
$uid = 660000000;
$rule = Rule::unique('member_record')->where(function ($query) use ($uid) {
return $query->where('uniqueID', $uid)->orwhere('client_member_id', $uid);
});
$data['foo'] = 0;
$validator = Validator::make($data, [
'foo' => [$rule]
]);
return $validator;
}
此响应的结果
Column not found: 1054 Unknown column 'foo' in 'where clause' (SQL: select count(*) as aggregate from
member_record
wherefoo
= 0 and (uniqueID
= 660000000 orclient_member_id
= 660000000))
如果您想在 where 子句的第一部分中排除“等于”,您将执行如下所示的唯一检查
'member_id' => ['unique:member_record,foo']
如果您想添加额外的 where 子句,那么您可能需要这样做
'member_id' => ['unique:member_record,foo,NULL,id,bar,' . $uid]
这将返回如下所示的 SQL
select count(*) as aggregate from
member_record
wherefoo
= 660000000 andbar
= 660000000
关于php - Laravel 唯一规则验证器在 Validator::make 期间被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59742520/