Laravel: Как я могу проверить два необязательных поля даты, используя правила до и после проверки - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь проверить поля даты, так что active_from должно быть датой до active_until , а active_until должно быть датой после active_from .

Оба поля скрыты и отключены, пока пользователь не выберет Да в поле выбора с именем active .

Когда пользователь выберет Да, active_from появляется и становится обязательным, и active_until также появляется, но это необязательно, и здесь кроется моя проблема, потому что проверка завершается неудачно, когда active_until не заполнен.

Из того, что я понял, если поле может или не может быть включено / не существует, я должен использовать правило иногда, которое будет проверять другие проверки, только если поле существует и включено. Например,

'active_from' => 'sometimes|required_if:active,yes|date|before:active_until',

Правило обнуляемости должно использоваться, если поле может быть заполнено или не заполнено, но должно ли оно также использоваться, если поле может существовать или не существовать? Например,

'active_until' => 'sometimes|nullable|date|after:active_from',

Итак, мой вопрос, как я могу проверить, если active_from раньше active_until только если active выбрано Да и только если active_until заполнено.

Правильно ли я использую правила, должно active_from использовать только иногда правило или оно также должно использовать обнуляемое правило?

код:

$validated = $request->validate([
    'title' => 'required|string|min:3|max:30|unique:categories',
    'description' => 'nullable|string|min:3|max:255',
    'active' => 'required|in:yes,no',
    'active_from' => 'sometimes|required_if:active,yes|date|before:active_until',
    'active_until' => 'sometimes|nullable|date|after:active_from',
    'highlighted' => 'sometimes|required_if:active,yes|in:yes,no',
    'highlighted_from' => 'sometimes|required_if:highlighted,yes|date|before:highlighted_until',
    'highlighted_until' => 'sometimes|nullable|date|after:highlighted_from',
]);

Ответы [ 2 ]

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

Для сложных правил проверки

    use Illuminate\Support\Facades\Validator; 

    .... 
    $data = $request->all();
    $validator = Validator::make($data,[
       //...your unconditional rules goes here
    ]);

    //your conditional rules goes here
    $validator->sometimes('active_form', 'before:active_until', function ($request) {
        return $request->filled('active_until');//if here return true,rules will apply
    }); 

Важная ссылка
правила условного добавления
получение-ввод

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

Я смог наконец понять это.

Это мой фиксированный код:

$validated = $request->validate([
    'title' => 'required|string|min:3|max:30|unique:categories',
    'description' => 'nullable|string|min:3|max:255',
    'active' => 'required|in:yes,no',
    'active_from' => 'required_if:active,yes|date',
    'active_until' => 'nullable|date|after:active_from',
    'highlighted' => 'required_if:active,yes|in:yes,no',
    'highlighted_from' => 'required_if:highlighted,yes|date',
    'highlighted_until' => 'nullable|date|after:highlighted_from',
]);

Вместо того, чтобы проверять обе даты так, что одна является необязательной, даже если пользователь выбирает Да на active select, мне просто нужно проверить дату active_until (необязательно), чтобы узнать, является ли она действительной датой после active_from date.

Таким образом, даже если пользователь не заполняет дату active_until , проверка не удастся, потому что у меня есть правило обнуляемости в этом поле.

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

'active' => 'sometimes|required|in:yes,no',

Таким образом, это требуется только в том случае, если он присутствует в запросе, но поскольку в моем коде используется required_if, в этом нет необходимости, поскольку он зависит от значения другого поля.

...