【问题标题】:Laravel - show exception if model/row doesn't exist or soft deletedLaravel - 如果模型/行不存在或软删除,则显示异常
【发布时间】:2015-12-08 10:14:03
【问题描述】:

假设我有一个名为“Manufacturer”的模型,其控制器有一个显示方法

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

还有一个带有 find 方法的 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();
}

因此,如果我将 find 替换为 findOrFail,它会吐出一条错误消息 Call to undefined method Illuminate\Database\Eloquent\Collection::findOrFail()

【问题讨论】:

  • return Manufacturer::findOrFail($id)->toJson(); 如果我没记错的话,你可以用 404 错误页面捕捉到这个。
  • 请用实际代码检查我的编辑,findOrFail 与关系无关。

标签: php laravel exception laravel-5 laravel-5.1


【解决方案1】:

而不是 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();

【讨论】:

  • 是的,理想情况下应该可以解决问题。但我也在使用关系。您能否在编辑中查看我的实际代码。
  • 我已经更新了答案。您在结果集合而不是查询生成器上调用 findOrFail。
  • 非常感谢,太完美了:)
【解决方案2】:

如果你想显示自定义视图而不是 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');
     }
}

【讨论】:

  • 是的,我知道这听起来很愚蠢,但如果我不使用 toJson(),那么所有模型隐藏字段也会显示出来。
  • “隐藏字段”是什么意思?
  • 隐藏字段,我的意思是:protected $hidden = ['password', 'remember_token'];在模型中
  • 我更新了我的答案。您可以在数组中指定所需的列名作为first() 函数的参数。
猜你喜欢
  • 2017-07-29
  • 2020-06-30
  • 2016-11-07
  • 2022-12-06
  • 1970-01-01
  • 2018-04-10
  • 2019-02-17
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多