拉拉维尔 |唯一验证 where 子句

Posted

技术标签:

【中文标题】拉拉维尔 |唯一验证 where 子句【英文标题】:Laravel | Unique validation where clause 【发布时间】:2018-08-19 02:25:47 【问题描述】:

我正在尝试验证存在的电子邮件地址的输入,但前提是 company_id 与请求中传递的 company_id 相同。

我收到此错误...

SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列 '1'(SQL:从 company_users 中选择 count(*) 作为聚合,其中 email_address = myemail.com 和 1 company_id)

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

这是我当前的代码...

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

【问题讨论】:

【参考方案1】:

必须是这样的:

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

【讨论】:

它如何知道我希望排除的 company_id 是什么? 即使我更改了公司的 ID,它也表示已被占用。好像是在全局搜索邮件? 它知道 ID 在您的情况下属于规则中给出的表 company_users ,因此它会从该表中选择所有电子邮件并排除具有ID 等于你想要排除的内容,然后计算行数 结构是| id | company_id | email_address | password | 这似乎不起作用 那些是company_users的列吗?【参考方案2】:

通过在变量周围添加' 单引号将$request->company_id 设为字符串。否则 mysql 会认为是你表中的一列。

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

【讨论】:

Unknown column '6' in 'where clause' (SQL: select count(*) as aggregate from company_users` 其中email_address = email@email.com 和6 company_id`【参考方案3】:

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

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

这意味着,电子邮件必须是唯一的,同时忽略具有NULLid 且其company_id$request->company_id 相同的行。

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

'unique:company_users,email_address,1'

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

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

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

【讨论】:

太棒了,简单而且有效!【参考方案4】:

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

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

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

希望对你有帮助

【讨论】:

这似乎适用于唯一的电子邮件,但是我如何链接我之前进行的所需 + 电子邮件验证? @tallent123 你可以单独使用 'email' => 'required' 然后这个 表示如果我这样做会有重复的数组键 @tallent123 你也可以通过闭包和验证数组。让我更新他的答案 我现在明白了Method Illuminate\Validation\Validator::validateRequired|email does not exist.

以上是关于拉拉维尔 |唯一验证 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:尝试使用唯一键组合的“更新”语句。卡在 where 子句中

如何使用 where/have 子句选择唯一行并与另一个表进行比较

laravel eloquent获取多个用户之间的所有常见聊天

SQL 更改 where 子句中的过滤器数量

选择不同的值,传递到 Where 子句

带有 WHERE 的 DISTINCT 子句