Привет, ребята, я пытаюсь проверить, принадлежит ли категория определенному пользователю, я пробовал это, но получаю сообщение об ошибке, когда я ввожу несуществующее значение. Что пробовал:

'category' => ['nullable','exists:categories,id', function ($attribute, $value, $fail) {


    $category = Category::where('id', $value)->first();

    if($category->vcard!= $this->vcard->phone_number)
    {
       $fail('The selected category is invalid.');
    }
}]

Таким образом, это работает, когда я ввел действительную категорию, но если я ввел неправильную категорию, например, идентификатор категории 100000, который не существует, выдает мне эту ошибку на почтальоне:

enter image description here

Я думал, что 'exists:categories,id' исправит меня, несуществующие идентификаторы.

Работает:

{
 "payment_reference": "a1@mail.com",
 "payment_type": "PAYPAL",
 "type": "D",
 "value": 10,
 "description": "Teste",
 "category": 500
}

Не работает:

{
 "payment_reference": "a1@mail.com",
 "payment_type": "PAYPAL",
 "type": "D",
 "value": 10,
 "description": "Teste",
 "category": 1000000
}
0
Gonçalo Bastos 27 Ноя 2021 в 19:27

1 ответ

Лучший ответ

Простой способ исправить это - проверить, является ли $category нулем или нет:

if($category && $category->vcard != $this->vcard->phone_number) {
   $fail('The selected category is invalid.');
}

При использовании find или first с Eloquent модель будет возвращена, если она существует, и null будет возвращена, если нет.


В качестве альтернативы вы можете использовать проверку bail. правило для category:

'category' => [
    'bail',
    'nullable',
    'exists:categories,id',
    function ($attribute, $value, $fail) {
        $category = Category::where('id', $value)->first();

        if ($category->vcard != $this->vcard->phone_number) {
            $fail('The selected category is invalid.');
        }
    },
],

Это будет означать, что если правило exists не срабатывает, закрытие даже не будет выполнено.

2
Rwd 27 Ноя 2021 в 19:44
Работал очень хорошо, `` залог '', я думал, что laravel сделал это по вине (сбой при первом правиле проверки)
 – 
Gonçalo Bastos
27 Ноя 2021 в 19:47