Laravel-如果模型/行没有';不存在或软删除


Laravel - show exception if model/row doesn't exist or soft deleted

假设我有一个名为"Manufacturer"的型号,它有一个显示方法的控制器

public function show($id)
{
    $manufacturer = json_decode( $this->manufacturer->find($id) );
    return view('viewManufacturer', compact('manufacturer'));
}

和一个Eloquent存储库,使用查找方法

public function find($id)
{
    return Manufacturer::find($id)->toJson();
}

现在,如果一个模型不存在或被软删除,它会给我一个致命的异常

FatalErrorException in ManufacturerRepository.php line 22:
Call to a member function toJson() on null

我如何设置一个异常,这样它就不会显示默认的错误页面,而是显示一个自定义错误页面,类似于"找不到制造商"。

编辑:我确实试过了,但它返回了一个错误。上面提到的问题只是为了演示,实际上我有另一个型号叫车辆。制造商与车辆有一对多的关系。

public function find($id, $columns1 = array('*'), $columns2 = array('*'))
{
    return Manufacturer::with(['vehicles' => function($q) use ($columns2){
           $q->select($columns2);
    }])->get($columns1)->find($id)->toJson();
}

因此,如果我用findOrFail替换find,它会抛出一个错误,说Call to undefined method Illuminate'Database'Eloquent'Collection::findOrFail()

不调用find()方法调用findOrFail()-如果找不到模型,此方法将抛出ModelNotFoundException,这将导致应用程序中出现404页面。

更新:

在您的第二个示例中,替换:

return Manufacturer::with(['vehicles' => function($q) use ($columns2){
  $q->select($columns2);
}])->get($columns1)->find($id)->toJson();

带有

return Manufacturer::with(['vehicles' => function($q) use ($columns2){
  $q->select($columns2);
}])->findOrFail($id, $columns1)->toJson();

如果您想显示自定义视图而不是404页面。

public function find($id) {
    $manufacturer = Manufacturer::find($id)->first();
    if($manufacturer) {
       return $manufacturer->toJson();
    }
    return false;
}
public function show($id) {        
    $manufacturer = $this->manufacturer->find($id);
    if($manufacturer) {
        $manufacturer = json_decode($manufacturer);
        return view('viewManufacturer', compact('manufacturer'));
     }
     else {
        return view('viewManufacturerNotFound');
     }
}

顺便说一句,为什么你先用toJson(),然后用json_decode()

无json编码/解码:

public function find($id) {
    return Manufacturer::find($id)->first(['column1','column2']);        
}
public function show($id) {        
    $manufacturer = $this->manufacturer->find($id);
    if($manufacturer) {            
        return view('viewManufacturer', compact('manufacturer'));
     }
     else {
        return view('viewManufacturerNotFound');
     }
}