这里,我在发布控制器中有一个简单的laravel代码,用于存储发布。我想拥有唯一的标题。因此,我将数据库中的标题设置为唯一。在下面的代码中,我有一个try-catch语句。但是,当我创建标题重复的帖子时,出现错误(显示 laravel错误页面),并且catch不会调用!我不知道为什么,我有点困惑。有人可以帮我吗?
$post = Post::create([
'title' => $request->title,
'content' => $request->content,
'category_id' => $request->category
]);
try {
$post->save();
Session::flash('success', 'New post created successfully.');
}
catch (\Exception $e)
{
Session::flash('success', $e->getMessage());
}
return redirect()->route('post.index');
laravel错误页面说:
Illuminate \ Database \ QueryException(23000)SQLSTATE [23000]: 违反完整性约束:1062密钥的重复条目“ T3” 'posts_title_unique'(SQL:插入
posts
(title
,content
,category_id
,updated_at
,created_at
)值(T3,kj; k,, 2018-12-20 19:53:52,2018-12-20 19:53:52))
我要向用户显示此错误。所以我用了try-catch语句。但似乎无法正常工作。 在此链接中,try-catch应该有效:Laravel Model->save() returns false but no error。我也用catch来管理其他可能发生的错误
答案 0 :(得分:4)
问题是您正在Post::create()
块之外使用try-catch
。 create()
函数不仅会在内存中创建模型实例,还会在新创建的实例上调用save()
,从而使对save()
的显式调用变得多余。
您真正想要的是在new Post(...)
块内使用Post::create(...)
或try-catch
:
try {
$post = Post::create([
'title' => $request->title,
'content' => $request->content,
'category_id' => $request->category
]);
Session::flash('success', 'New post created successfully.');
}
catch (\Exception $e)
{
Session::flash('success', $e->getMessage());
}
return redirect()->route('post.index');