У меня есть уроки и есть тест для урока. Я ищу конкретный тест, который существует для некоторых уроков и не существует для некоторых уроков.
$test = Test::where('level', 'medium')->where('lesson_id', $lesson->id)->firstOrFail();
Я имею в виду, что если код выше элемента не существует, как я собираюсь назначить его как пустой массив, я получаю сообщение об ошибке, потому что в некоторых случаях он не находит данные, я пытался поместить код внутри try and catch, но мне это не помогло !
Можете ли вы показать, как вы используете/тестируете данные, то есть где вы проверяете, пусты ли они?






firstOrFail должен генерировать исключение, поэтому в try catch вы сможете его разрешить, другой подход заключается в следующем:
$test = Test::where('level', 'medium')->where('lesson_id', $lesson->id)->first() ?? [];
оператор ?? означает, что если результатом первой части является null, он вернет пустой массив.
Чтобы получить данные из базы данных или пустого массива (коллекции), если нет соответствующих данных, вы можете использовать функцию get() в построителе запросов.
$test = Test::where('level', 'medium')
->where('lesson_id', $lesson->id)
->get();
firstOrFail() функция возвращает первый найденный элемент, но если элемент не существует, выдается исключение ModelNotFoundException. Я не знаю, почему вы хотите разместить здесь пустой массив, но это решение для вашего случая:
$test = Test::where('level', 'medium')
->where('lesson_id', $lesson->id)
->first(); // this returns null if item doesn't exist
$test = $test ?? []; // this turns null to empty array
Лучшее решение состоит в том, чтобы взять null из результата запроса и проверить его, если. Пример:
$test = Test::where('level', 'medium')
->where('lesson_id', $lesson->id)
->first();
if (!$test) {
// do this, if item doesn't exist
}
или вот так:
try {
$test = Test::where('level', 'medium')
->where('lesson_id', $lesson->id)
->firstOrFail();
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
// do this, if item doesn't exist
}
вы можете использовать exists() или dontExist(), чтобы проверить, существуют ли записи или нет.
$test = Test::where('level', 'medium')->where('lesson_id', $lesson->id)->exists();
Ни
firstOrFail(), ниfirst()не вернут массив. Это действительно то, чего вы хотите?