【问题标题】:Laravel Query Builder firstOrFail()?Laravel 查询生成器 firstOrFail()?
【发布时间】:2016-01-10 22:28:01
【问题描述】:

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

    $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() 的唯一方法吗?查询生成器是否允许这样的事情?

【问题讨论】:

  • 您可以扩展 Illuminate 构建器,添加方法并替换 DB 外观。我可以问你为什么不在这里使用 Eloquent 吗? :)
  • 这是一个简单的查询,我需要一个字段,我认为这里不需要 Eloquent
  • Eloquent(以及一般的 ORM)背后的整个想法是您创建一个表示数据的模型(在您的情况下,是一个 DB 表);我想说,如果您使用 Eloquent 或使用 Facade,您将有几乎相等的开销。 Eloquent 更具可读性。如果您愿意,可以进行性能测试:)

标签: php sql laravel orm


【解决方案1】:

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

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

【讨论】:

  • 不错,这个应该推送到github/laravel
  • 请记住,如果找不到模型,eloquent 会抛出 ModelNotFound 异常。这意味着未处理的异常将返回 404,而使用 this 将返回 500。
【解决方案2】:

你快到了,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

希望对你有帮助

【讨论】:

  • firstOrFail() 是另一回事。如果存在则返回该项目,如果不存在则期望
  • 我是怎么做到的,我把存在放在一个函数中以获取布尔值,然后像你在问题中所做的那样使用该布尔值来检索或抛出异常 if($item == null),仅在我的情况下是 if(function()) db::table()->where()->first() else throw exception,我会更新答案
猜你喜欢
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多