php - Laravel 唯一规则验证器在 Validator::make 期间被破坏

标签 php mysql laravel

我正在尝试使用 Rule::unique('table')->where(function($query) use($x) {...}); 检查(a)列是否唯一。功能,但是当我将其传递到验证器时,我收到一个奇怪的错误。我认为正在发生的情况是,它试图检查我提供的语句中的值是否相等,但它还检查它认为是表的唯一 ID 列的列,但事实并非如此,因此它正在破坏。

protected function validator(array $data)
{
    $uid = 660000000;
    $rule = Rule::unique('member_record')->where(function ($query) use ($uid) {
        return $query->where('uniqueID', $uid);
    });

    return Validator::make($data, [
        'fullName' => ['required', 'string', 'min:2'],
        'member_id' => [
            'bail', 'required', 'Numeric', $rule,
            'exists:new_benefits_member,member_id'
        ],
        'email' => ['bail', 'required', 'email', 'confirmed', 'unique:user,email'],
        'password' => [
            'required', 'string', 'min:8', 'confirmed',
            'regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{8,}$/'
        ],
        'terms' => ['required']
    ]);
}

但是,我收到了如下所示的错误。

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'member_id' in 'where clause' (SQL: select count(*) as aggregate from member_record where member_id = 660000000 and (uniqueID = 660000000))

我唯一的假设是,当我将数据传递到 Validator::make($data... 时它试图将 $rule 与 $data 数组进行比较,但它搞砸了。如果您有任何我可以尝试的修复方法,请告诉我。

最佳答案

这里的问题是 Rule::unique() 函数可以采用 2 个参数,如下所示

public static function unique($table, $column = 'NULL')
{
    return new Rules\Unique($table, $column);
}

如果列保留为“NULL”,那么这将默认为验证器中键的名称::make($x, [] <--- array

如本例所示。

protected function validator(array $data)
{
    $uid = 660000000;
    $rule = Rule::unique('member_record')->where(function ($query) use ($uid) {
        return $query->where('uniqueID', $uid)->orwhere('client_member_id', $uid);
    });
    $data['foo'] = 0;
    $validator = Validator::make($data, [
        'foo' => [$rule]
    ]);
    return $validator;
}

此响应的结果

Column not found: 1054 Unknown column 'foo' in 'where clause' (SQL: select count(*) as aggregate from member_record where foo = 0 and (uniqueID = 660000000 or client_member_id = 660000000))

如果您想在 where 子句的第一部分中排除“等于”,您将执行如下所示的唯一检查

'member_id' => ['unique:member_record,foo']

如果您想添加额外的 where 子句,那么您可能需要这样做

'member_id' => ['unique:member_record,foo,NULL,id,bar,' . $uid]

这将返回如下所示的 SQL

select count(*) as aggregate from member_record where foo = 660000000 and bar = 660000000

关于php - Laravel 唯一规则验证器在 Validator::make 期间被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59742520/

相关文章:

php - 将数组值与同一数组中的其他值进行比较

php - 如何查询和排列两个相似的表

mysql - 如何对外键引用表进行检查约束,mysql?

laravel - 如何在 Laravel 5.2 中为登录条件添加额外的逻辑

php - 使用PHP的关联数组的一行总和?

javascript - NVD3.js | php | unix 时间戳不起作用

mysql - 使用更新增加列或创建更新触发器 - mysql

mysql - 从 mysql 中的触发器或存储过程调用 REST API?

php - undefined variable : categories in Blade Laravel 6. 4.0

laravel - 使用 Eloquent 或 raw 语句删除多个 JSON 键