为了账号安全,请及时绑定邮箱和手机立即绑定

不想编辑存储和更新功能中使用的特定字段

不想编辑存储和更新功能中使用的特定字段

PHP
精慕HU 2023-09-22 14:36:22
产品控制器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'],    ]);}这里的代码与表产品相比具有独特的价值。但每当我编辑表单时,它都会说代码已被采用。那么如何在不编辑“代码”的情况下执行此操作(其独特)。
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

您可以在唯一检查期间忽略某些 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返回调用,这样数据库中的任何产品都不会被忽略,或者在更新时传递 id,然后仅忽略该产品。null


来自文档:


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


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


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


use Illuminate\Validation\Rule;


Validator::make($data, [

    'email' => [

        'required',

        Rule::unique('users')->ignore($user->id),

    ],

]);

但请注意以下几点:


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


查看完整回答
反对 回复 2023-09-22
?
慕神8447489

TA贡献1780条经验 获得超1个赞

所以这里的问题是您使用相同的规则来创建产品和更新产品。


如果您使用的是最新的 Laravel,您可能需要阅读有关表单请求的文档https://laravel.com/docs/7.x/validation#form-request-validation并创建不同的表单请求以进行存储和更新。


如果你还想用你的方式,你可以尝试如下


private function validateRequest()

{

    $rules = [

        'sub_category_id' => ['required'],

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

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

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

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

    ];

    

    if (request()->isMethod('store')) {

        $rules['code'] = ['required', 'alpha_dash'];

    }


    return request()->validate($rules);

}

请告诉我是否有效!


查看完整回答
反对 回复 2023-09-22
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

试试这个,正确且干净的代码


产品控制器


use Illuminate\Validation\Rule; // add this


public function store()

{

    $product = Product::create($this->validateRequest());


    return redirect('/product'); //use route instead of URL

}


public function update(Product $product)

{

    $product->update($this->validateRequest($product->id));


    return redirect('/product'); //use route instead of URL

}


private function validateRequest($id = null)

{

    return request()->validate([

        'sub_category_id' => 'required',

        'name' => 'required|min:4',

        'code' => 'required|alpha_dash|' . Rule::unique('products')->ignore($id),

        'description' => 'required|min:4',

        'color' => 'required|min:3',

        'price' => 'required|integer',

    ]);

}

建议使用Form请求验证


查看完整回答
反对 回复 2023-09-22
  • 3 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信