为什么这种独特的 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-1Post 1hellohello! 等情况下,我希望对 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)]);

效果很好。