【问题标题】:Laravel update record where something has been changedLaravel 更新记录已更改的内容
【发布时间】:2016-12-07 18:33:43
【问题描述】:

我想要 write 方法来更新已更改的记录。我有表格:

问题是当我更改姓名、姓氏或电子邮件但不更改用户登录时。在我的验证中,我写道:

'name' => ['required', 'max:255', 'unique:users'],

但是当我没有更改用户名时,unique:users 规则阻止我更新。

我找到了这个主题Laravel 5 isDirty() always returns false,但我不明白什么是“$partnersData”。 $partnersData 是上次更新日期?

我写了这个方法:

public function update(CreateUserUpdateRequest $request, $id){
    $user = User::find($id);

    foreach ($user as $column => $value) {
        if ($column === $id) {
            continue;
        }
        $user->$column = $value;
    }

    if ($user->isDirty()) {
        $user->update($request->all());
        Session::flash('userUpdateOK', 'Dane użytkonika zostały zaktualizowane poprawnie.');
    }

    return redirect('user');
}

【问题讨论】:

  • 问题不清楚。是否要更新记录并收到名称验证错误?
  • 如果您希望 nameunique 规则一起保留以进行验证,请尝试添加 Forcing A Unique Rule To Ignore A Given ID 中解释的其他规则。

标签: laravel updates


【解决方案1】:

要更新您的记录循环您的请求

foreach ($request as $column => $value) {
    // do something
}

在循环内部检查属性是否存在,如果存在则替换

if (property_exists($user, $column)) {
    $user->$column = $value;
}

所以你的代码会是这样的

public function update(CreateUserUpdateRequest $request, $id){
    $user = User::find($id);

    foreach ($request as $column => $value) {
        if (property_exists($user, $column)) {
            $user->$column = $value;
        }
    }

    if ($user->isDirty()) {
        $user->save();
        Session::flash('userUpdateOK', 'Dane użytkonika zostały zaktualizowane poprawnie.');
    }

    return redirect('user');
}

或者你可以Model::set(array())

public function update(CreateUserUpdateRequest $request, $id){
    $user = User::find($id);
    $user->set($request);

    if ($user->isDirty()) {
        $user->save();
        Session::flash('userUpdateOK', 'Dane użytkonika zostały zaktualizowane poprawnie.');
    }

    return redirect('user');
}

【讨论】:

    【解决方案2】:

    函数 'unique:users' 在我未更改登录名(“名称”)的情况下让我更新记录。

    你必须稍微改变一下验证规则:

    'name' => ['required', 'max:255', 'unique:users,name,' . $id],
    

    如果用户是您要更新的用户,这将忽略唯一性。

    文档here 中“强制使用唯一规则忽略给定 ID”下还描述了另一种可能的语法。

    那么你就可以正常更新了。

    附带说明,更新只有在实际发生更改时才有效,否则updated_at 列不会更改。

    【讨论】:

      【解决方案3】:

      我认为你可能过于复杂了。

      您可以检查用户表中是否存在该行,然后只需更新相关字段 -

      $User = User::where('name', $request->input('name'))->first();
      
      if($User){
          $User->email = $request->input('email');
          $User->save();
      }
      
      return redirect('user')
      

      Laravel save() 函数运行 isDirty() 函数并确保只有在任何列发生更改时才会更新数据库。

      【讨论】:

      • updated_at 列仅在行中实际更新某些内容时更新。
      【解决方案4】:

      另外$user->column = $value; 应该是$user->$column = $value;,在列变量之前缺少$

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-11
        • 2023-03-28
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 2020-05-30
        • 2014-12-14
        • 2020-11-04
        相关资源
        最近更新 更多