问题是当我更改姓名,姓氏或电子邮件但不更改用户登录时。在我的验证中,我写道:
'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');
}
答案 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;
错过列变量之前的$