Laravel更新记录更改了某些内容

时间:2016-12-07 09:21:31

标签: laravel updates

我希望使用write方法来更新已更改内容的记录。我有表格: enter image description here

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

'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');
}

4 个答案:

答案 0 :(得分: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');
}

答案 1 :(得分:1)

  

功能'唯一:用户'我记录了我没有更改登录的记录("名称")。

您必须稍微更改验证规则:

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

如果用户是您正在更新的用户,则会忽略唯一性。

文档here中描述的另一种可能的语法是"强制一个唯一的规则忽略一个给定的ID"。

然后你可以正常更新。

作为辅助信息,更新仅在实际更改时生效,否则updated_at列不会发生变化。

答案 2 :(得分:0)

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

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

$User = User::where('name', $request->input('name'))->first();

if($User){
    $User->email = $request->input('email');
    $User->save();
}

return redirect('user')

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

答案 3 :(得分:0)

同样$user->column = $value;应该$user->$column = $value;错过列变量之前的$