Laravel自定义唯一验证规则



我在这里搜索了一些与我的问题相关的问题,并应用了它们。但结果仍然不是我想要的。以下是参考资料:

Laravel条件唯一性验证

Laravel|where子句的唯一验证

在我的情况下,我希望在更新时验证请求中的name字段是否唯一,仅当请求的值与数据库中以前存储的name不同时。这是我当前的代码。

if(Request::method() == 'PUT') $rules = array_merge($rules, [
'name' => [
'required',
'string',
'max:255',
Rule::unique('tags')->where(function ($q) use ($request) {
$q->where('name', '!=', strtolower($request['name']));
})
]
]);

在我的数据库中,我有一些数据行。这些数据的name产品、事件和活动。当我想在请求中用产品更新活动名称时,验证不会使其唯一。它返回

SQLSTATE[23000]:完整性约束冲突:1062键"tags_name_unique"的重复条目"product"(SQL:updatetagssetname=product,tags.updated_at=2020-10-08 02:35:52,其中id=14(

我希望我解释得很好。有人能帮我吗?提前谢谢。

编辑#1:我的tags表迁移:

public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->id();
$table->string('name')->nullable()->unique();
$table->text('description')->nullable();
$table->timestamps();
});
}

编辑#2:

这是Postman的JSON请求负载。

{
"id": 14,
"name": "product",
"description": "Descriptions"
}

我认为您不需要仅仅为了检查同一模型上的唯一验证而执行所有这些操作。

你试过这个吗?

if(Request::method() == 'PUT') $rules = array_merge($rules, [
'name' => [
'required',
'string',
'max:255',
'unique:tags',
])

这应该很好用。如此处文档中所述如果要检查同一模型的所有条件,则不必显式检查where条件。

最新更新