在 Laravel 5 中更新时验证唯一的 Slug

我目前有一个模型,它有一个文本字段和一个 slug 字段。

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

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

这在创建时工作正常,并正确拒绝创建重复的辅助信息块。但是,在我的更新方法上,它不会让我保存记录,因为 slug 已经存在。当然,slug 确实存在,但它存在于正在编辑的记录中,因此我想继续允许保存它。但是,它不应该在另一个记录上更改为数据蛞蝓。

以下是我的更新文章控制器方法的外观:

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

    return redirect('articles');
}

有没有办法让它在L5中工作?


答案 1

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

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

它对我有用。


答案 2

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

您可以创建2个单独的请求(一个用于创建,一个用于更新),但您也可以通过这种方式检查是否设置(我假设您的更新URL看起来像):/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;
    }
}

推荐