为什么这种独特的 Laravel 验证不起作用?
Why isn't this unique Laravel validation working?
我一直在搜索互联网和 laravel 文档,试图让它正常工作。
理想情况下,我可以只使用 $request->validate() 方法。但我也尝试过手动制作和报告错误(这让我更接近了一点,但仍然没有在我需要的地方工作)。
这是我的情况。
有人创建了 post。他们创建一个标题,我根据该标题生成一个 slug。
标题必须是唯一的。这按预期工作。我总是收到一条很好的错误消息,提示标题必须是唯一的。
slug 也必须是独一无二的。如果有人命名为 post hello
,然后将另一个命名为 post hello!
,这可能是个问题
<form ...>
<input type="text" name="title" id="title">
</form>
所以他们提交,在我的控制器方法中,在我进行任何验证之前,我将 slug 添加到请求中。
$request->slug = Str::slug($request->title);
然后我尝试验证
$request->validate([
'title' => 'required|unique:posts',
'slug' => 'unique:posts,slug'
]);
在 Post-1
和 Post 1
或 hello
和 hello!
等情况下,我希望对 slug 的验证失败与对标题的验证方式相同。
但相反,它没有,然后我收到 SQL 错误
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'post-1' for key 'posts.posts_slug_unique'
我用 Validator::make
得到了它...但仅适用于存储方法。它仍然不适用于更新。而且,它几乎没有那么干净。
有人看到我做错了什么吗?
@uz4ir 帮我解决了。
这可能不是最佳实践解决方案,但有计划在将来向表单添加自定义 slug 输入。所以以后会去掉这段代码。
我看过的其他解决方案似乎要付出更多的努力,此时我看不出将 slug 添加到请求中有什么坏处。
改变
$request->slug = Str::slug($request->title);
至
$request->request->add(['slug' => Str::slug($request->title)]);
效果很好。
我一直在搜索互联网和 laravel 文档,试图让它正常工作。
理想情况下,我可以只使用 $request->validate() 方法。但我也尝试过手动制作和报告错误(这让我更接近了一点,但仍然没有在我需要的地方工作)。
这是我的情况。
有人创建了 post。他们创建一个标题,我根据该标题生成一个 slug。
标题必须是唯一的。这按预期工作。我总是收到一条很好的错误消息,提示标题必须是唯一的。
slug 也必须是独一无二的。如果有人命名为 post hello
,然后将另一个命名为 post hello!
<form ...>
<input type="text" name="title" id="title">
</form>
所以他们提交,在我的控制器方法中,在我进行任何验证之前,我将 slug 添加到请求中。
$request->slug = Str::slug($request->title);
然后我尝试验证
$request->validate([
'title' => 'required|unique:posts',
'slug' => 'unique:posts,slug'
]);
在 Post-1
和 Post 1
或 hello
和 hello!
等情况下,我希望对 slug 的验证失败与对标题的验证方式相同。
但相反,它没有,然后我收到 SQL 错误
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'post-1' for key 'posts.posts_slug_unique'
我用 Validator::make
得到了它...但仅适用于存储方法。它仍然不适用于更新。而且,它几乎没有那么干净。
有人看到我做错了什么吗?
@uz4ir 帮我解决了。
这可能不是最佳实践解决方案,但有计划在将来向表单添加自定义 slug 输入。所以以后会去掉这段代码。
我看过的其他解决方案似乎要付出更多的努力,此时我看不出将 slug 添加到请求中有什么坏处。
改变
$request->slug = Str::slug($request->title);
至
$request->request->add(['slug' => Str::slug($request->title)]);
效果很好。