【问题标题】:Laravel validator - Integrity constraint violationLaravel 验证器 - 违反完整性约束
【发布时间】:2016-07-27 17:59:50
【问题描述】:

我有员工,它在数据库中具有(自动递增)唯一 ID(很简单 :))但我想检查其他字段的唯一性,这将是他们的员工编号 ..

在创建新员工时,这很容易,因为我只需调用:

$this->validate($request, [                
                           'employee_number' => 'required|unique:employees'
                           ]);

但是我如何在编辑现有员工时执行此操作?我想检查(如果“编辑的”员工编号对于 OTHER 用户是唯一的......这意味着我需要将此查询重写为 laravel 验证表单

employee_number NOT IN (SELECT employee_number 
                        FROM employees 
                        WHERE id = *edited_user_id*)

我试过这样做

$this->validate($request, [                
                           'employee_number' => 'required|unique:employees,id,'.$input['employee_id']
                           ]);

想象一下,“员工”表中有记录

id |  name  | employee_number
-----------------------------
1  |  Peter |      0001
2  |  Paul  |      0002
3  |  Frank |      0003

当我尝试更改 Frank 的数据时 -> 没关系 .. 即使我将他的员工编号更改为某个唯一的编号,它也可以正常工作 ..

但是,当我为弗兰克的帐户插入现有的帐户时,即 0001,它并没有给我一个正确的错误消息(来自验证器),表明员工编号已被占用.. 但不是那样,而是将我重定向到错误页面

Whoops, looks like something went wrong.

QueryException in Connection.php line 669:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0001' for key 'employees_employee_number' (SQL: *here comes the wrong sql query*)

您知道如何在表单上方显示正确的错误栏,例如当我尝试插入新员工并尝试插入现有 ID 时?

【问题讨论】:

    标签: validation laravel


    【解决方案1】:

    你在'required|unique:employees,id,'.$input['employee_id'] 中犯了一个小错误。 现在,您正在查看您的输入 employee_numberemployees 表中的 id 字段中是否唯一。

    将该行更改为: 'required|unique:employees,employee_number,'.$input['employee_id'] 你很高兴!

    来自 Lavarel 文档:unique:table,column,except,idColumn

    【讨论】:

    • maaaaaaan,你是我的救星 :) 我欠你一杯啤酒!! +1 非常感谢您
    【解决方案2】:

    如果验证器失败,我会收集如下所示的错误消息

    $rules = ['employee_number' => 
    
        'required|unique:employees,employee_number,'.$input['employee_id']]
    
        $validator = \Validator::make($data = \Input::all(), $rules);
    
                if ($validator->fails()) {
                    return [
                        return [
                            "status" => "fail",
                            "errors" => $validator->getMessageBag()->toArray()
            ];
                    ];
                }
    

    现在从您发送请求的地方收集响应,作为响应,您将获得一个关联的错误消息数组,您可以根据自己的使用情况使用它。

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 2016-08-11
      • 1970-01-01
      • 2019-01-02
      • 2017-09-11
      • 2020-06-14
      • 2016-05-25
      • 2020-01-14
      相关资源
      最近更新 更多