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 - 查询没有返回结果

MYSQL查询同一个表的值

mysql - 如何在SQL Server中多次使用一张表进行内连接?

linux - 启动 Vagrant 时连接超时

php - 如何在laravel中为api后端返回JSON数据之前定义数据类型

php - 如何将文件添加到开头?

php - 带有 ExtJS 的基于 php 的搜索工具在 Windows 环境下运行不佳

php - sitemap.xml 是用页面加载还是仅由机器人加载?

php - 使用 fsockopen 指定源 ip

javascript - Tizen 上的 VueJS 和 Laravel 5.4 不起作用