在Laravel 5中验证Update上的唯一Slug

Rap*_*ure 12 php laravel laravel-5 laravel-validation laravel-request

我目前有一个具有文本字段和段塞字段的模型.

我验证了slug在我的表单请求类中是唯一的:

public function rules()
{
    return [
        'name' => 'required|min:3',
        'slug' => 'required|alpha_dash|unique:questions'
    ];
}
Run Code Online (Sandbox Code Playgroud)

这在创建时工作正常,并且正确地拒绝创建重复的slugs.但是在我的更新方法中,它不会让我保存记录,因为slug已经存在.当然slug确实存在,但它存在于正在编辑的记录中,所以我想继续允许它被保存.但是,它不应该被改为另一个记录上的slu ..

这是我的更新ArticlesController方法的样子:

public function update(Article $article, ArticleRequest $request)
{
    $article->update($request->all());

    return redirect('articles');
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让这个工作在L5?

Pur*_*ple 7

尝试修改您的规则,如下所示(在表单请求类中):

public function rules()
{
    return [
      'name'  => 'required,min:3',
      'slug'  => 'required|alpha_dash|unique:categories,slug,'.$this->id')
    ];
}
Run Code Online (Sandbox Code Playgroud)

这个对我有用。

  • `$this->id` 是否依赖于路由中具有名为 `id` 参数的 `Request` 对象?就像“/whatever/{id}”。如果是 `/whatever/{whatever_id}` 我会使用 `$this->whatever_id` 吗? (2认同)

Mar*_*łek 4

唯一规则中,您可以指定要忽略的 id。

您可以创建 2 个单独的请求(一个用于创建,一个用于更新),但您也可以通过这种方式检查是否已设置(我假设您的更新网址如下所示/questions/2):

public function rules()
{
    $rules = [
        'name' => 'required|min:3',
        'slug' => ['required', 'alpha_dash']
    ];

    $rule = 'unique:questions';

    $segments = $this->segments();
    $id = intval(end($segments));
    if ($id != 0) {  
         $rule .= ',slug,' . $id;
    }
    $rules['slug'][] = $rule;

    return $rules;
    }
}
Run Code Online (Sandbox Code Playgroud)