Laravel Query Builder firstOrFail()?

时间:2015-10-13 08:49:25

标签: php sql laravel orm

当我使用查询生成器时,我总是发现自己在做这样的事情:

    $item = \DB::table('table')->where('slug',$slug)->first();

    if ($item===null)
        throw \Exception('Not found');

如果像Eloquent这样的firstOrFail()可以很容易地解决这个问题:

$item = \DB::table('table')->where('slug',$slug)->firstOrFail();

Eloquent是使用firstOrFail()的唯一方法吗? Query Builder是否允许这样的内容?

2 个答案:

答案 0 :(得分:2)

您可以通过宏自行将其添加到查询构建器:

DB::query()->macro('firstOrFail', function () {
    if ($record = $this->first()) {
        return $record;
    }

    throw new Exception('No records found');
});

然后你可以像使用Eloquent一样使用它:

$item = DB::table('table')->where('slug', $slug)->firstOrFail();

答案 1 :(得分:1)

您快到了,laravel确实提供了一种检查此类内容的方法

DB::table('table')->where('slug', $slug)->exists()

DB::table('table')->where('slug', $slug)->doesntExist()

它将返回布尔值,希望对您有帮助

更新: 我在项目中的工作方式是

function checkIfExists($table, $value, $field = 'id'){
    return DB::table($table)->where($field, $value)->exists()
}
function getFirst($table, $value, $field = 'id'){
    return DB::table($table)->where($field, $value)->first()
}

然后像这样使用此功能

if(checkIfExists('users', 2))
    $user = getFirst('users', 2)
else
    // throw exception or something

希望这会有所帮助