Laravel:在失败时处理findOrFail()

时间:2015-10-07 09:47:05

标签: php laravel laravel-5.1

我正在寻找可以像findOrDo()的东西。就像没有找到数据时一样。有点像

Model::findOrDo($id,function(){
   return "Data not found";
});

在laravel中是否有任何类似的东西,我可以优雅而美丽地做到这一点?

*我尝试使用谷歌搜索,但找不到一个

6 个答案:

答案 0 :(得分:10)

use Illuminate\Database\Eloquent\ModelNotFoundException;

// Will return a ModelNotFoundException if no user with that id
try
{
    $user = User::findOrFail($id);
}
// catch(Exception $e) catch any exception
catch(ModelNotFoundException $e)
{
    dd(get_class_methods($e)) // lists all available methods for exception object
    dd($e)
}

答案 1 :(得分:4)

另一个选项是修改我在进行此更改的$HOME/.vscode/extensions函数的app / Exceptions / Handler.php中找到的默认Laravel异常处理程序:

render()

通过这种方式而不是获得500,我发送了一个带有自定义消息的400而无需对每个public function render($request, Exception $e) { if(get_class($e) == "Illuminate\Database\Eloquent\ModelNotFoundException") { return (new Response('Model not found', 400)); } return parent::render($request, $e); }

进行尝试捕获

答案 2 :(得分:1)

一个替代过程可以是评估一个集合。所以,

$modelCollection = Model::where('id', $id)->get();
if(!$modelCollection->isEmpty()) {
    doActions();
}

我同意它并不像您或我所喜欢的那样优雅,单线或具体情况,但除了每次都编写try catch语句外,这是一个不错的选择。

答案 3 :(得分:0)

默认情况下,当您在Laravel 5应用程序中使用Eloquent模型的findOrFail并且它失败时,它会返回以下错误:

ModelNotFoundException in Builder.php line 129:
'No query results for model [App\Model]'.

因此要捕获异常并显示一个自定义404页面,其中包含错误消息,例如" Ooops" ....

打开app/Exceptions/Handler.php文件,将下面显示的代码添加到渲染函数的顶部:

public function render($request, Exception $e)
{
   if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) 
   {
      abort(404, 'Oops...Not found!');
   }

   return parent::render($request, $e);
}

来源:https://selftaughtcoders.com/from-idea-to-launch/lesson-16/laravel-5-findorfail-modelnotfoundexception-show-404-error-page/

答案 4 :(得分:0)

从Laravel v5.7开始,您可以执行此操作(retrieving single model答案的@thewizardguy版本)

// $model will be null if not found
$model = Model::where('id', $id)->first();

if(!$model) {
    doActions();
}

答案 5 :(得分:0)

晚些时候参加聚会,from laravel 5.4 onward, Eloquent Builder supports macros。因此,我将编写如下的宏(在单独的提供程序中)。

Builder::macro('firstOrElse', function($callback) {
   $res = $this->get();

   if($res->isEmpty()) {
       $callback->call($this);
   }

   return $res->first();
});

然后我可以进行如下检索。

$firstMatchingStudent = DB::table('students')->where('name', $name)
    ->firstOrElse(function() use ($name) {
        throw new ModelNotFoundException("No student was found by the name $name");
    });

如果结果集不为空,它将分配结果集的第一个对象,否则将适应作为闭包传递给宏的行为(在这种情况下,抛出Illuminate\Database\Eloquent\ModelNotFoundException)。

对于模型而言,这也是可行的,只是模型始终返回构建器实例