如果数据尚未更新 v 表单,则不显示成功消息 laravel

do not show the success message if the data hasnt been updated n a form laravel

我有一个表格,据此更新数据并将其存储到数据库中,它显示成功 message.if 其中一个输入未填写,它显示 error.am 出现错误,当我想重新更新数据,当我单击保存数据时,我使用现有输入打开表单,应该只是重定向回上一页,而不显示成功消息,因为数据还没有 updated.how 我可以实现吗这个,我在这里寻找逻辑开发人员..这是我的更新功能代码

   public function update(Request $request)
{
    try {

        $validation = Validator::make($request->all(), [
            'systemid' => 'required',
            'category' => 'required',
            'subcategory' => 'required',
            'prdcategory' => 'required',
            'prdbrand' => 'required'
        ]);

        Log::debug('Request: '.json_encode($request->file()));

        if ($validation->fails()) {
            throw new \Exception("validation_error", 19);
        }

        $systemid = $request->systemid;
        $product_details = product::where('systemid', $systemid)->first();
    
        
        $changed = false;

        if ($request->has('product_name')) {
            if ($product_details->name != $request->product_name) {
                $product_details->name = $request->product_name;
                $changed = true;
            }
        }

        if ($request->has('category')) {
            if ($product_details->prdcategory_id != $request->category) {
                $product_details->prdcategory_id = $request->category;
                $changed = true;
            }
        }


        if ($request->has('subcategory')) {
            if ($product_details->prdsubcategory_id != $request->subcategory) {
                $product_details->prdsubcategory_id = $request->subcategory;
                $changed = true;
            }

            if ($product_details->ptype == 'voucher') {
                $voucher = voucher::where('product_id', $product_details->id)->first();
                if($voucher->subcategory_id != $request->subcategory){
                    $voucher->subcategory_id = $request->subcategory;

                    $voucher->save();

                    $changed = true;
                }
            }
        }

        if ($request->has('prdcategory')) {
            if ($product_details->prdprdcategory_id != $request->prdcategory) {
                $product_details->prdprdcategory_id = $request->prdcategory;
                $changed = true;
            }
        }


        if ($request->has('prdbrand')) {
            if ($product_details->brand_id != $request->prdbrand) {
                $product_details->brand_id = $request->prdbrand;
                $changed = true;
            }
        }

        if ($request->has('description')) {
            if ($product_details->description != $request->description) {
                $product_details->description = $request->description;
                $changed = true;
            }
        }
        if ($changed == true || true) {
            $product_details->save();
            $msg = "Product information updated successfully";
            $data = view('layouts.dialog', compact('msg'));

                //i have added this code but it doesnt work
        } else if($changed == false) {
            return back();
            $data = '';
        }
    }
    return $data;
}

我的laravel项目版本是5.8

下一行的计算结果总是 True $changed == true || true

最后缺少 catch 语句,所以我不得不添加它。

而且我建议你直接获取 $product_details 的脏版本。

您可以使用 $product_details->isDirty() // boolean.

或者更好的方法是使用 $product_details->wasChanged() // boolean

这是一些调整后的代码:

public function update(Request $request)
{
    try {
        $validation = Validator::make($request->all(), [
            'systemid' => 'required',
            'category' => 'required',
            'subcategory' => 'required',
            'prdcategory' => 'required',
            'prdbrand' => 'required'
        ]);

        Log::debug('Request: '.json_encode($request->file()));

        if ($validation->fails()) {
            throw new \Exception('validation_error', 19);
        }

        $systemid = $request->systemid;
        $product_details = Product::where('systemid', $systemid)->first();

        $changed = false;
        // Looping for all inputs:
        $fieldsToCheck = [
            'name' => 'product_name',
            'prdcategory_id' => 'category',
            'prdsubcategory_id' => 'subcategory',
            'prdprdcategory_id' => 'prdcategory',
            'brand_id' => 'prdbrand',
            'description' => 'description',
        ];
        foreach ($fieldsToCheck as $productColumnName => $requestFieldName) {
            $requestInput = $request->{$requestFieldName};
            if ($request->has($requestFieldName)) {
                if ($product_details->$productColumnName != $requestInput) {
                    $product_details->$productColumnName = $requestInput;
                    $changed = true;
                }
            }
            // Exception for Sub Category to check for the voucher.
            if ($requestFieldName == 'subcategory') {
                $this->handleVoucher($requestInput);
            }
        }


        // here I advise you to simply get the dirty version of $product_details
        // you can use $product_details->isDirty() // boolean
        // or even better use $product_details->wasChanged() // boolean
        if ($changed) {
            $product_details->save();
            $msg = 'Product information updated successfully';
            $data = view('layouts.dialog', compact('msg'));

        } else {
            return back();
            // Todo Mo: No need for this line so I commented it out.
            //$data = '';
        }
    } catch (\Exception $e) {
        dd($e->getMessage(), 'Oops, error occurred');
    }

    return $data;
}

private function handleVoucher($product_details, $subcategory)
{
    if ($product_details->ptype == 'voucher') {
        $voucher = voucher::where('product_id', $product_details->id)->first();
        if ($voucher->subcategory_id != $subcategory) {
            $voucher->subcategory_id = $subcategory;
            $voucher->save();
        }
    }
}