Обратите внимание на это предложение:
$rooms = Room
::All() // <---
->where('room_status', 'Vacant')
->where('room_type', $room_type);
Когда вы выполняете метод all()
, вы извлекаете все записи в вашей таблице rooms
(поэтому вы выполняете запрос там). В основном это запрос select *
, поэтому на этом этапе вы получаете набор элементов, соответствующих этому условию (это: набор всех Room
объектов).
Что следует из вашего кода, так это то, что вы ограничиваете результаты методом where()
, но обратите внимание, что, учитывая, что у вас уже есть экземпляр коллекции returnetd, это ограничение выполняется в collection уровень, а не на уровне база данных * уровень 1016 *.
Что происходит, когда вы выполняете предложения where()
и в коллекции нет объекта, соответствующего условию? Он вернет коллекцию empty
. Это:
=> Illuminate\Database\Eloquent\Collection {#3444
all: [],
}
Таким образом, это означает, что оно никогда не сгенерирует исключение, указанное вами в предложении try-catch (ModelNotFoundException
), даже если модель не найдена. Итак, когда вы вернете свои результаты в ваше представление.
Как ее решить: Хорошо, вы можете выполнить запрос после того, как вы укажете предложения where, чтобы они выполнялись на уровне базы данных, а затем выдавали ошибку. Другой вариант - использовать существующую настройку, а затем подсчитать возвращаемую коллекцию и вручную выдать исключение. Я дам вам ответ по первому варианту:
$rooms = Room
::where('room_status', 'Vacant')
->where('room_type', $room_type);
->get(); // <---- here we execute the query.
Так как вы могли бы выдать ошибку, если модель не найдена?
if( ! $rooms->count())
{
throw new ModelNotFoundException();
}
Для второго варианта просто:
if( ! $rooms->count())
{
throw new ModelNotFoundException();
}