如何在得到空结果时使用Eloquent的toArray时避免错误

时间:2019-01-05 09:57:39

标签: laravel laravel-5.7

我从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();

那么还有什么更好的方法吗?

2 个答案:

答案 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();