拉拉维尔 |唯一验证 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
这意味着,电子邮件必须是唯一的,同时忽略具有NULL
的id
且其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 子句选择唯一行并与另一个表进行比较