【问题标题】:Laravel validation rule fails when trying to update the same record with no changesLaravel 验证规则在尝试更新相同记录而不进行更改时失败
【发布时间】:2020-06-02 00:22:36
【问题描述】:

我有一个名为Sides 的表,其中包含idnameside_category_id 和其他一些目前不重要的字段。

我想验证在创建新的side 记录时,该记录不存在。所以,假设我在数据库中有一条记录,例如:

id: 1
name: Salad
side_category_id: 3

如果我尝试使用name = 'salad'side_category_id = 3 插入新记录,则创建必须失败并返回错误。

我通过使用以下规则实现了这一点:

$rules = [
   'name'             => 'required',
   'side_category_id' => 'required|exists:side_categories,id|unique:sides,side_category_id,NULL,id,name,' . $this->request->get('name')
]

到目前为止一切顺利。它按预期工作。但是现在如果我想编辑一条记录并保存它而不做任何修改,它会返回一个错误,这不是我想要的结果。

如果我尝试在不进行任何修改的情况下更新记录,它应该会成功。如何更新我的规则以实现这一目标?

【问题讨论】:

  • 您必须在逗号后将要忽略的记录的 id 传递给唯一规则 'side_category_id' => '....|unique:sides,side_category_id,' . $this->request->get('id')
  • @porloscerrosΨ 我刚试过但没有用。仍然收到同样的错误提示:侧面类别 id 已被占用。
  • 您是在请求中接收记录 id 还是作为路由参数?如果它是一个路由参数,并且您将其作为函数 arg 获取,例如 public function update(Request $request, $id),您应该使用 $id 变量。 '...|unique:sides,side_category_id,' . $id 或者如果您使用像 public function update(Request $request, Model $model) 这样的模型绑定,您应该使用 '....|unique:sides,side_category_id,' . $model->id
  • 是的,我收到了 id 作为路由参数。我已将我的规则更新为...|unique:sides,side_category_id,' . $this->route('id'),但同样的错误不断出现。 (没有直接使用$id,因为它说它没有定义)

标签: php laravel eloquent laravel-validation laravel-formrequest


【解决方案1】:

你可以使用 Rule::unique()

对于创建这样使用

$rules = [
   'name'             => ['required'],
   'side_category_id' => ['required',Rule::unique('sides', 'name')->where(function ($query) use($category_id) {
    return $query->where('side_category_id', $category_id);
}),Rule::exists('side_categories')]
]

对于更新

$rules = [
       'name'             => ['required'],
       'side_category_id' => ['required',Rule::unique('sides', 'name')->where(function ($query) use($category_id) {
        return $query->where('side_category_id', $category_id);
    })->ignore($id),Rule::exists('side_categories')]
    ]
//$id should be you parameter

【讨论】:

  • 是的,我想过这个问题,但我不太高兴拥有两个独立的FormRequest,如果可能的话,我宁愿拥有一个,因为正在执行基本相同的操作(存储)
  • 您可以使用第二条规则进行 create and update 更新时必须将对象 id 作为 request 参数更改 ->ignore($id) 到 @ 987654325@
猜你喜欢
  • 2019-06-24
  • 1970-01-01
  • 2014-10-17
  • 2019-04-02
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
相关资源
最近更新 更多