【问题标题】:Update data only if user change anything in laravel仅当用户更改 laravel 中的任何内容时才更新数据
【发布时间】:2021-02-13 10:24:08
【问题描述】:

仅当用户更改任何内容时才更新数据,否则会返回没有更新的消息。单击编辑按钮后,如果用户点击更新按钮而没有更改任何内容,则返回没有更新的消息。 如果用户更改了编辑表单中的任何内容,那么它将被更新。

我试过了

( I have multiple fields. This is for demo)
   
    if ($user->name == $request->name && $user->email == $request->email && $user->contact == 
       $request>contact) {
            return back()->with('info', 'You have not change anything. Nothing to update!');

        } else {
            $user->update([
                'name'    => $request->name,
                'email'   => $request->email,
                'contact' => $request->contact,
                'image'   => $image,
            ]);

        }
        return redirect()->route('admin.home')->with('success', 'Profile has been updated');

除了图片之外,这个工作很好。

这是我的图片上传过程

 if ($request->has('image')) {
     Storage::delete('public/avatar/users/' . $user->image);
      $image_name = hexdec(uniqid());
      $ext  = strtolower($request->image->getClientOriginalExtension());
      $image_full_name = $image_name . '.' . $ext;
      $request->image->storeAs('avatar/users/', $image_full_name, 'public');
      $image = $image_full_name;
        } else {
            $image = $user->image;
        }

如何使用图像执行此操作?最好的方法是什么?

【问题讨论】:

  • 什么是$image 和$user->$image?一条路?
  • $image =$request->image,
  • 好的,那么$request->image 是什么?服务器上图片的路径?
  • 不,图片来自编辑表单
  • 请发布处理图像上传过程的代码,因为我们无法确定您是使用 LOB 还是处理上传并将其移动到使用原始文件名等路径,@987654326 @ 或者如果它只是一个 URL 等。

标签: php mysql laravel eloquent


【解决方案1】:

由于 Eloquent 可以跟踪对模型所做的更改,因此我建议使用 Model Attribute Examinations 来确定模型是否为 ::wasChanged()。

由于您的原始脚本处理上传的文件并将$user->image作为字符串保存到数据库中,您需要将上传的文件源与当前图像文件源(如果有)进行比较,以确定图像更改是否应该已申请。

if ($request->has('image')) {
    //only check image if supplied
    if (!$user->image || sha1_file(Storage::path('public/avatar/users/' . $user->image)) !== sha1_file($request->image->path())) {
        //apply image changes
        if ($user->image) {
            //remove previous image
            Storage::delete('public/avatar/users/' . $user->image);
        }
        $image = str_replace('.', '', uniqid('', true)) . '.' . strtolower($request->image->getClientOriginalExtension());
        $request->image->storeAs('avatar/users/', $image, 'public');
        $user->fill(['image' => $image]);
    }
}
$user->fill([
    'name'    => $request->name,
    'email'   => $request->email,
    'contact' => $request->contact,
]);
$user->save();
if ($user->wasChanged(['name', 'email', 'contact', 'image'])) {
    return redirect()->route('admin.home')->with('success', 'Profile has been updated');
}

return back()->with('info', 'You have not change anything. Nothing to update!');

免责声明

我不建议使用hexdec(uniqid()),而是直接使用uniqid('', true)。因为hexdec() 的使用会忽略它遇到的任何非十六进制字符,并可能导致不希望的结果或数据丢失。

例如:https://3v4l.org/aFGEJ

var_dump(hexdec("See"));
var_dump(hexdec("ee"));
// both print "int(238)"

【讨论】:

    【解决方案2】:
    $updatedUser = $user->update([
        'name' => $request->name,
        'email' => $request->email,
        'contact' => $request->contact,
        'image' => $image,
    ]);
    if (serialize($user) == serialize($updatedUser)) {
       // user has updated something
    } else {
      // no changes were made
    }
    

    【讨论】:

    • 我采用了你的方式,如果我改变了一些东西,那么我得到了这个 // 没有做任何改变,如果我没有改变任何东西,那么也得到了这个 // 没有做任何改变
    • @ihprince 逻辑也是相反的,如果两个值相等,那么什么都没有改变。您的结果是由 ->update() 和 ->save() 返回一个布尔值引起的。所以serialize(object) == serialize(bool) 永远是false。
    猜你喜欢
    • 2021-05-05
    • 2018-09-23
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2015-11-02
    相关资源
    最近更新 更多