如果Eloquent查询没有返回答案,最好的检查方法是什么


What is the best way to check if an Eloquent query returns no answer?

我使用的是Laravel 4。假设我有一个Eloquent模型(病人),我想找一个叫Bob的病人,我会这样做:

$patient = Patient::where('name', '=', 'Bob');

检查$patient是否为有效记录的最佳方法是什么?

如果数据库查询没有找到任何匹配的结果,则返回null。因此

$patient = Patient::where('name','=','Bob')->first();
if ( is_null($patient) ) {
  App::abort(404);
}

(注意:在最初的问题中,您在查询中忘记了->first()(或->get())。别忘了,否则你会得到一个Eloquent对象,而不是结果。)

使用这个:

$patient = Patient::where('name', '=', 'Bob')->firstOrFail();

它将在成功时返回Eulquent模型,或在失败时抛出ModelNotFoundException。

我知道这是旧的,但这是谷歌第二次搜索时出现的,所以。对于那些不需要一条记录或无法使用->firstOrFail()的情况(我的用例是一个异步typeahead api,最多返回10个结果),唯一对我有效的是count():

$patient = Patient::where('name', '=', 'Bob')->get(); //you could have more than one bob
if (!count($patient)) {
    return 'No records found';
}
$patient = Patient::where('name','Bob')->get();
if ( $patient->isEmpty() ) {
  return response(['error' => 'Record not found'], 404);
}

类似Patient::where('name', '=', 'Bob')->exists()的东西可能会起作用。它将返回一个布尔值。

只需使用原生php中的empty()即可解决所有问题,如果对象为null,则返回true,如果查询生成器中laravel的collection为空(但已初始化),则也将返回true。

$contributor = Contributor::whereVendor('web')->first();
if(empty($contributor)){
   ...
}

在传递id参数以获取单个记录的情况下使用findOrFail($id)

我在寻找::find($id)->firstOrFail语法的解决方案时发现了这个错误。

$patient = Patient::findOrFail($id);