Laravel Новая условная валидация: обязательный_if + существует правило - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь проверить 'parent_code' attr относительно 'level' значения поля

Вот что я пытаюсь достичь:

'parent_code' требуется только когда 'level' равно! = 0 (эта часть работает нормально)

и когда оно установлено, оно также должно существовать в таблице 'products' ('product_code': столбец имя, которое будет использоваться)

Мой текущий код (не работает должным образом)

Класс ресурсов продукта

public function fields(Request $request) {
        return [
            ID::make()->sortable(),

            Text::make('Product code', 'product_code')
                ->rules('required')
                ->creationRules('unique:products,product_code')
                ->updateRules('unique:products,product_code,{{resourceId}}')->hideFromIndex(),


            Text::make('Product short name', 'product_short_name')->onlyOnForms(), 


            Textarea::make('Product name', 'product_name')
                ->rules('required')
                ->sortable()
                ->onlyOnForms(),

            Text::make('Parent code', 'parent_code')
                ->rules(['required_if:level,2,4,6', 'exists:products,product_code'])
                ->hideFromIndex(), 

            Select::make('Level', 'level')->options([
                '0' => 'Sector level',
                '2' => 'H2',
                '4' => 'H4',
                '6' => 'H6',
            ])->rules('required')->sortable(),    

        ];
}

Создать форму продукта

Create product form

Спасибо за помощь.

1 Ответ

1 голос
/ 10 февраля 2020

Правильным способом было бы использовать метод sometimes() в экземпляре валидатора, но вы не можете получить к нему доступ из Laravel Новых правил.

Вы можете просто определить rules как замыкание, которое получает текущий входящий запрос и проверяет значение для динамического построения массива правил:

Laravel Решение коллекций

Text::make('Parent code', 'parent_code')
    ->hideFromIndex()
    ->rules(function ($request) {
        // You could also use "->when(...)" instead of "->unless(...)"
        // and invert the condition (first argument)
        return collect(['required_if:level,2,4,6'])
            ->unless($request->level === 0, function ($rules) {
                return $rules->push('exists:products,product_code');
            })
            ->toArray();
    }),

Лог c без использования коллекций то же самое, просто используйте basi c if для динамического добавления условий:

Обычный PHP Решение для массивов

Text::make('Parent code', 'parent_code')
    ->hideFromIndex()
    ->rules(function ($request) {
        return [
            'required_if:level,2,4,6',
            ($request->level !== 0) ? 'exists:products,product_code' : '',
        ];
    }),

или (вариант ):

Text::make('Parent code', 'parent_code')
    ->hideFromIndex()
    ->rules(function ($request) {
        $rules = ['required_if:level,2,4,6'];

        if ($request->level !== 0) {
            $rules[] = 'exists:products,product_code';
        }

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