Laravel |唯一验证 where 子句

Laravel | Unique validation where clause

我正在尝试验证存在的电子邮件地址的输入,但仅当 company_id 与随请求传入的 company_id 相同时才有效。

我收到这个错误...

SQLSTATE[42S22]: Column not found: 1054 Unknown column '1' in 'where clause' (SQL: select count(*) as aggregate from company_users where email_address = myemail.com and 1 <> company_id)

我已经在线阅读,方法是将 table 和验证中的列相关联,这就是我正在做的。

这是我当前的代码...

required|email|unique:company_users,email_address,company_id,' . $request->company_id

它必须像:

required|email|unique:company_users,email_address,' . $request->company_id

格式为:

unique:table,column,'id to exclude'

或者,如果您想根据列进行验证,您可以进行单独的查询:

$exists = Model::where('company_id','!=',$request->company_id)->where('email',$request->email)->count()
if($exists) {
  // return an error or a validation error
}

通过在变量周围添加 ' 单引号使 $request->company_id 成为一个字符串。否则MySQL会认为是你的table中的一列。

required|email|unique:company_users,email_address,company_id,"'" . (int) $request->company_id . "'"

这应该可以回答您的问题。

'required|email|unique:company_users,email_address,NULL,id,company_id,' . $request->company_id

这意味着,电子邮件必须是 唯一的,同时忽略 idNULL 且其 company_id 是与 $request->company_id.

相同

except 参数忽略要与验证进行比较的行。例如,abc@gmail.com 的电子邮件地址已被用户 1 使用,但您这样做了:

'unique:company_users,email_address,1'

它将忽略 id 为 1 的用户。因此输入相同的电子邮件仍然会通过 existing 用户具有相同电子邮件的已被忽略。

这与您的情况不同,因为您只是不想忽略特殊行,而是想根据条件忽略行。这就是这个答案如何帮助你,通过添加更多字段验证 after ignore 参数。

你可能想看看这个:laravel 4: validation unique (database) multiple where clauses

这是一个粗略的想法,你可以实现你想要的

您可以使用 Rule class 为您自定义验证规则。

'email' => ['required', 'string', 'email', 'max:191',Rule::unique('users')->where(function ($query) use ($request) {
    return $query->where('company_id', $request->company_id);
})],

希望对您有所帮助