获取空结果时如何避免使用 Eloquent 的 toArray 时出错

afr*_*jpg 0 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();
Run Code Online (Sandbox Code Playgroud)

那么有没有更好的办法呢?

Dig*_*ter 5

以下任何一种都可以使用,每种方法都提供自己处理空结果的方法:

1.可选帮手:

可选函数接受任何参数,并允许您访问该对象的属性或调用该对象的方法。如果给定的对象为 null,则属性和方法将返回 null 而不是导致错误。

$user_data = optional($user_model->first())->toArray();
Run Code Online (Sandbox Code Playgroud)

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'];
});
Run Code Online (Sandbox Code Playgroud)

3.救援帮手:

救援函数执行给定的闭包并捕获其执行期间发生的任何异常。捕获的所有异常都将发送到您的异常处理程序的报告方法;但是,请求将继续处理。

$data = rescue(function () use ($select) {
    \App\Model\User::where('id', $id);

    if ($select) {
        $user_model->select(explode(',', $select));
    }

    return $user_model->first()->toArray();
});
Run Code Online (Sandbox Code Playgroud)

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...
}
Run Code Online (Sandbox Code Playgroud)