我正在寻找可以像findOrDo()的东西。就像没有找到数据时一样。有点像
Model::findOrDo($id,function(){
return "Data not found";
});
在laravel中是否有任何类似的东西,我可以优雅而美丽地做到这一点?
*我尝试使用谷歌搜索,但找不到一个
答案 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);
}
答案 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
)。
对于模型而言,这也是可行的,只是模型始终返回构建器实例。