处理Laravel中没有的数据

时间:2016-07-08 10:58:39

标签: laravel error-handling

Laravel有一个名为findOrfail()的内置方法here

  

未找到例外

     

有时,如果找不到模型,您可能希望抛出异常。这在路线或控制器中特别有用。 findOrFail和firstOrFail方法将检索查询的第一个结果。但是,如果未找到任何结果,将抛出Illuminate \ Database \ Eloquent \ ModelNotFoundException:

     

$ model = App \ Flight :: findOrFail(1);

     

$ model = App \ Flight :: where(' legs','>',100) - > firstOrFail();

但是如果你想编写自己的代码来处理没有找到的结果怎么办?所以在我的控制器中我需要类似的东西:

public function show($id)
{
    $data = JobCardHead::where('JobCardNum', $id)->first();

    If no data found then 
       some code
    else
       some code

2 个答案:

答案 0 :(得分:1)

如果没有找到不抛出异常的方法的模型,Eloquent会返回什么?我猜它是nullfalse。因此,您可以检查first()调用的返回值:

$data = JobCardHead::where('JobCardNum', $id)->first();

if ($data) {
  // found it
} else {
  // not found
}

或者,知道firstOrFail()抛出异常,您可以将调用包装在try / catch块中:

use Illuminate\Database\Eloquent\ModelNotFoundException;

//..

try {
    $data = JobCardHead::where('JobCardNum', $id)->first();
} catch (ModelNotFoundException $e) {
    // Data not found. Here, you should make sure that the absence of $data won't break anything
}

// Here $data is an instance of the model you wanted

您应该选择的确切方法实际上取决于您的使用情况。

UPD。顺便说一下,如果此处$id是您的主要关键字,则只需使用find($id)findOrFail($id)as described here

答案 1 :(得分:0)

当没有返回任何记录时,Laravel会在null对您的模型的调用中返回first()

https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Query/Builder.php#L1548

因此,举例来说,你可以做一个更清洁的解决方案:

public function show($id)
{
    if ($job = JobCardHead::where('JobCardNum', $id)->first()) {
        // Record was found!

        return view('job.show', compact('job'));
    }

    return view('404');
}