【问题标题】:Laravel | Unique validation where clause拉拉维尔 |唯一验证 where 子句
【发布时间】: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

【问题讨论】:

    标签: mysql laravel api lumen


    【解决方案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.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2018-01-03
    • 2018-10-18
    • 1970-01-01
    • 2017-10-22
    • 2017-04-20
    • 2020-05-11
    相关资源
    最近更新 更多