Laravel нарушение уникального правила валидатора во время Validator :: make - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь проверить, являются ли столбцы (столбцы) уникальными, используя функциональность Rule::unique('table')->where(function($query) use($x) {...});, но когда я передаю это в свой валидатор, я получаю странную ошибку. Я думаю, что происходит то, что он пытается проверить, равно ли значение в предложении where, которое я предоставил, но также и в столбце, который он ДУМАЕТ, является столбцом уникального идентификатора для таблицы, но это не так, он ломается.

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]: Столбец не найден: 1054 Неизвестный столбец 'member_id' в 'предложении where '(SQL: выберите количество (*) как совокупность из member_record, где member_id = 660000000 и (uniqueID = 660000000))

Что я могу предположить только тогда, когда я передавая данные в Validator::make($data..., он пытается сравнить правило $ с массивом $ data и портит его. Дайте мне знать, если у вас есть какие-либо исправления, которые я могу попробовать.

1 Ответ

0 голосов
/ 15 января 2020

Проблема здесь в том, что функция Rule :: unique () может принимать 2 параметра, как показано ниже

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

, если столбец оставлен как 'NULL', то по умолчанию это имя ключа в validator :: make ($ x, [] <--- array </p>

, как показано в этом примере.

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;
}

приводит к этому ответу

Столбец не найден: 1054 Неизвестный столбец 'foo' в 'предложении where' (SQL: выберите количество (*) в качестве совокупности из member_record, где foo = 0 и (uniqueID = 660000000 или 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 (*) в качестве агрегата от member_record, где foo = 660000000 и bar = 660000000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...