首页 > 解决方案 > 不想编辑用于存储和更新功能的特定字段

问题描述

产品控制器

public function store()
{
    $product = Product::create($this->validateRequest());

    return redirect('/product');
}

public function update(Product $product)
{
    $product->update($this->validateRequest());

    return redirect('/product');
}

private function validateRequest()
{
    return request()->validate([

        'sub_category_id' => ['required'],

        'name' => ['required', 'min:4'],

        'code' => ['required', 'alpha_dash','unique:products'],

        'description' => ['required', 'min:4'],

        'color' => ['required', 'min:3'],

        'price' => ['required', 'integer'],
    ]);

}

这里的代码在表格产品中具有独特的价值。但是每当我编辑表格时,它都会说代码已经采用。那么如何在不编辑“代码”(其唯一性)的情况下执行此操作。

标签: phplaravel

解决方案


您可以在唯一检查期间忽略某些 id:

use Illuminate\Validation\Rule;

public function store()
{
    Product::create($this->validateRequest(new Product()));

    return redirect('/product');
}

public function update(Product $product)
{
    $product->update($this->validateRequest($product));

    return redirect('/product');
}

private function validateRequest(Product $product)
{
    return request()->validate([
        'sub_category_id' => ['required'],
        'name' => ['required', 'min:4'],
        'code' => ['required', 'alpha_dash', Rule::unique('products')->ignore($product)],
        'description' => ['required', 'min:4'],
        'color' => ['required', 'min:3'],
        'price' => ['required', 'integer'],
    ]);
}

在这里,您要么在更新时传递现有模型,要么在存储时传递新模型实例,因此在存储新产品时调用$product->id要么返回null,因此不会忽略数据库中的产品,或者在更新时传递 id,然后仅忽略该产品。

文档

强制唯一规则忽略给定 ID:

有时,您可能希望在唯一检查期间忽略给定的 ID。例如,考虑一个包含用户名、电子邮件地址和位置的“更新配置文件”屏幕。您可能需要验证电子邮件地址是否唯一。但是,如果用户只更改名称字段而不更改电子邮件字段,则您不希望引发验证错误,因为用户已经是电子邮件地址的所有者。

为了指示验证器忽略用户 ID,我们将使用Rule 该类来流畅地定义规则。在这个例子中,我们还将验证规则指定为一个数组,而不是使用 | 用于分隔规则的字符:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

但请注意以下事项:

您永远不应将任何用户控制的请求输入传递​​给忽略方法。相反,您应该只传递系统生成的唯一 ID,例如来自 Eloquent 模型实例的自动递增 ID 或 UUID。否则,您的应用程序将容易受到 SQL 注入攻击。


推荐阅读