Laravel 唯一的验证规则,除了不工作

Posted

技术标签:

【中文标题】Laravel 唯一的验证规则,除了不工作【英文标题】:Laravel unique validation rule with except not working 【发布时间】:2020-02-23 22:23:18 【问题描述】:

Laravel 唯一验证规则,除了列无法更新,我的代码有什么问题?

public function update(Request $request, Article $article)

    abort_if($article->user_id !== $request->user()->id, 403);

    $article = $request->user()->articles()->update($request->validate([
        'title' => [
            'required',
            Rule::unique('articles', 'title')->ignore($article->id)
        ],
        'content'=>'required|min:90',
    ]));

    return redirect('articles/'.$article->id)->withSuccess('Article saved.');

错误:标题已被占用。

Laravel 版本:6.4.0

感谢您的帮助

【问题讨论】:

【参考方案1】:

您可以传递文章的整个实例以进行验证,如下所示:

Rule::unique('articles')->ignore($article);

因为你已经在说要检查哪一列了。

https://laravel.com/docs/6.x/validation

【讨论】:

【参考方案2】:

删除标题

Rule::unique('articles', 'title')->ignore($article->id)

...
$article = $request->user()->articles()->update($request->validate([
        'title' => [
            'required',
            Rule::unique('articles')->ignore($article->id)
        ],
        'content'=>'required|min:90',
    ]));
...

希望对你有帮助

更多信息,请查看rule-unique

【讨论】:

似乎我在数据库中有重复的标题。我不知道为什么,但我删除了数据库中的所有重复项,现在它可以工作了。 Rule::unique('articles')->ignore($article->id) 和 Rule::unique('articles')->ignore($article) 和 Rule::unique('articles', 'title') ->ignore($article->id) 现在都在工作。【参考方案3】:

如果您在$request->user()->articles() 上运行更新,您将更新所有用户的文章。如果用户只有 1 篇文章,那么它应该可以正常工作,但是如果有更多则这将导致数据被覆盖。

改为:

$article->update($request->validate([
    'title' => [
        'required',
        Rule::unique('articles', 'title')->ignore($article->id)
     ],
    'content'=>'required|min:90',
]));

【讨论】:

以上是关于Laravel 唯一的验证规则,除了不工作的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 验证唯一规则反射类异常

如何使唯一数组的自定义验证规则依赖于其他字段 laravel

Laravel 5.5 对具有不同列名的单独表的唯一验证规则

Laravel更新模型,具有属性的唯一验证规则

laravel 基于另一列值的唯一验证规则

基于数据透视表 laravel 的唯一名称规则验证