Как добавить функцию обрезки в правила проверки в Laravel Request?

У меня есть правило проверки, как показано ниже. Я использую exists, чтобы убедиться, что контракт уникален. Теперь проблема заключается в том, что номера контрактов хранятся в базе данных с пробелами, поэтому эта проверка не работает для этих случаев (например, она скажет, что номер контракта не существует из-за пробела перед номером). Чтобы решить эту проблему, я хочу выполнить обрезку (contract_number). Пожалуйста, как я могу применить функцию обрезки к contract_number ниже?

public function rules()
{
    return [   
        'tel' => 'required|max:25',
        'contract' => 'required|digits:9|exists:accounts,contract_number',
        'nom' => 'required|max:255',
        'language' => 'required|max:2',
        'g-recaptcha-response' => 'required|captcha',
    ];
}

person Fokwa Best    schedule 21.07.2020    source источник
comment
Не сильно поможет, но почему номера договоров хранятся (в базе) с пробелом перед ними? Любая веская причина?   -  person brombeer    schedule 21.07.2020
comment
вы можете найти свой ответ здесь stackoverflow.com/questions/29386203/laravel- 5-валидация-обрезка   -  person Mubin    schedule 21.07.2020
comment
@Mubin Laravel использует промежуточное ПО TrimStrings, поэтому все входные данные уже должны быть обрезаны. Проблема в том, что данные в базе данных имеют перед собой строку   -  person brombeer    schedule 21.07.2020
comment
Привет @kerbh0lz, я думаю, что информация в этом поле импортирована из файла Excel, поэтому в некоторых случаях есть пробелы.   -  person Fokwa Best    schedule 21.07.2020
comment
Вместо того, чтобы иметь дело с пользовательскими валидаторами (и, возможно, другими пользовательскими частями кода), которые лично работают с этими пробелами, я бы просто избавился от пробелов в базе данных.   -  person brombeer    schedule 21.07.2020
comment
Привет @kerbh0lz, в базе данных более 2 миллионов записей. Мы попросили администратора баз данных удалить пробелы в базе данных, но он порекомендовал нам урезать пробелы на уровне приложения.   -  person Fokwa Best    schedule 21.07.2020
comment
Является ли ваш администратор баз данных тем, кто изначально неправильно импортировал данные? ;) Это было просто предложение, я бы предпочел иметь чистые данные и никогда больше не сталкиваться с этой проблемой.   -  person brombeer    schedule 21.07.2020
comment
Я думаю, что это другая команда, которая неправильно импортировала данные   -  person Fokwa Best    schedule 21.07.2020
comment
@FokwaBest Я могу ответить на ваш вопрос? Вы можете проверить мой ответ в списке   -  person Basheer Kharoti    schedule 21.07.2020
comment
Привет @BasheerKharoti, спасибо за ваш ответ, но как мне добавить функцию обрезки к номеру контракта, поступающему из базы данных, используя ваш подход? Вы знаете, что номер контракта хранится в базе данных с пробелами, поэтому, когда пользователь вводит номер контракта в форму и нажимает «Подтвердить», он говорит, что его не существует из-за пробела. Я знаю, что обрезка перед проверкой решит проблему.   -  person Fokwa Best    schedule 05.08.2020
comment
Что-то вроде 'contract' => 'required|digits:9|exists:accounts,trim(contract_number)'   -  person Fokwa Best    schedule 05.08.2020
comment
@FokwaBest Laravel делает обрезку из коробки. См. app\Http\Kernel.php   -  person Basheer Kharoti    schedule 06.08.2020
comment
Привет @BasheerKharoti, номер контракта берется не из формы, а из базы данных. Laravel также обрезает информацию, поступающую из БД, из коробки? Проблема, с которой я столкнулся, заключается в следующем: у нас есть форма с полем номера контракта, когда пользователь вводит номер своего контракта и нажимает «Проверить», некоторые из них не найдены, потому что они хранятся с пробелами перед ними в базе данных.   -  person Fokwa Best    schedule 06.08.2020
comment
@FokwaBest смотрите мой обновленный ответ   -  person Basheer Kharoti    schedule 07.08.2020
comment
Привет @BasheerKharoti, большое спасибо. Ваш ответ работает   -  person Fokwa Best    schedule 10.08.2020


Ответы (1)


Из документов Laravel вы можете использовать метод withValidator для < strong>Запрос пользовательской формы, чтобы добавить любые дополнительные проверки на request. Удалите правило exists:accounts,trim(contract_number) из списка и попробуйте пользовательское правило с хуком after.

/**
* Configure the validator instance.
 *
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if (!\DB::table('accounts')->whereRaw('TRIM(contract_number) = ?', [request('contract_number')])->exists()) {
            $validator->errors()->add('contract_number', 'Contract number does not exists');
        }
    });
}
person Basheer Kharoti    schedule 21.07.2020
comment
Привет @BasheerKharoti, большое спасибо. Это решение работает - person Fokwa Best; 10.08.2020