我从5.7的新laravel项目开始,但是一个问题是,当我使用first()
来获取数据,并且如果数据不存在时,它将返回null
,然后执行toArray()
将引发PHP错误。因此,我使用跟随代码重新定义它。
$user_model = \App\Model\User::where('id', $id);
if ($select) {
$user_model->select(explode(',', $select));
}
$user_data = $user_model->first();
$user_data = $user_data ?? $user_data->toArray();
那么还有什么更好的方法吗?
答案 0 :(得分:3)
以下任何一种方法都可以使用,每种方法都提供了自己的方法来处理空结果:
1。 optional助手:
可选函数接受任何参数,并允许您访问 属性或该对象的调用方法。如果给定的对象为null, 属性和方法将返回null而不是导致错误。
$user_data = optional($user_model->first())->toArray();
2。 firstOr():
执行查询并获得第一个结果或调用回调。
$data = User::where('id', $id)->when(!is_null($select), function ($query) use ($select) {
return $query->select(explode(',', $select));
})->firstOr(function () {
return ['message' => 'No results'];
});
3。 rescue助手:
急救功能执行给定的闭包并捕获其执行期间发生的任何异常。捕获的所有异常将发送到您的异常处理程序的report方法。但是,该请求将继续处理。
$data = rescue(function () use ($select) {
\App\Model\User::where('id', $id);
if ($select) {
$user_model->select(explode(',', $select));
}
return $user_model->first()->toArray();
});
4。尝试捕获:
try {
$user_model = \App\Model\User::where('id', $id);
if ($select) {
$user_model->select(explode(',', $select));
}
$user_data = $user_model->first();
$user_data = $user_data ?? $user_data->toArray();
} catch(\Exception $e) {
// handle the exception...
}
答案 1 :(得分:0)
Laravel提供了一个firstOrFail
方法,默认情况下会引发404 Exception。
$user_data = $user_model->firstOrFail(); // If not found an exception is thrown and will be handled by default ExceptionHandler which displays a 404 error page.
// if found, cast the User to array
$user_data = $user_data->toArray();