Eloquent 流明任意更改所有字段
Lumen with Eloquent arbitrary changes all fields
代码如下:
$row = UserFields::where(['user_id' => $user['user_id'], 'field_id' => 'myfield'])->first();
if($row)
{
$row->field_value = "new value";
$row->save();
}
突然,table 中的所有行 field_value
更改为新值,并且仅针对该用户!
真是一头雾水,不知道是不是Eloquent的bug。
Laravel eloquent,像许多其他 ORM 一样不擅长处理复合主键。如果你看到它有
的代码
protected function setKeysForSaveQuery(Builder $query)
{
$query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery());
return $query;
}
public function getKeyName()
{
return $this->primaryKey;
}
由于您似乎有一个复合主键,它将只使用其中的第一个字段,因此用户的所有字段都将被更新。
推荐的选项是在映射表上也为主键添加一个id字段,或者如果你像我一样不想添加冗余字段,你可以使用
UserFields::where(['user_id' => $user['user_id'], 'field_id' => 'myfield'])->update(['field_value', "new value"]);
或
DB::table('user_fields')->where(['user_id' => $user['user_id'], 'field_id' => 'myfield'])->update(['field_value', "new value"]);
编辑:
对于任何感兴趣的人,我确实找到了我以前使用过的解决方案。在模型中,您可以像这样重载 setKeysForSaveQuery
函数
protected function setKeysForSaveQuery(Builder $query) {
$query->where('firstPKcolumn', $this->getAttribute('firstPKcolumn'))->where('otherPKcolumn', $this->getAttribute('otherPKcolumn'));
return $query;
}
然后你可以在模型上正常使用save
对于遇到相同问题的任何人,我设法使用基本的流明数据库查询方法解决了这个问题:
app('db')->update("UPDATE `xf_user_field_value` SET `field_value` = ? WHERE (user_id = ? AND field_id = ?);", [ $newValue, $user_id, $column ]);
我已经完全禁用 Eloquent,因为它对我来说太过分了,而且不够灵活,无法满足我的需求。
代码如下:
$row = UserFields::where(['user_id' => $user['user_id'], 'field_id' => 'myfield'])->first();
if($row)
{
$row->field_value = "new value";
$row->save();
}
突然,table 中的所有行 field_value
更改为新值,并且仅针对该用户!
真是一头雾水,不知道是不是Eloquent的bug。
Laravel eloquent,像许多其他 ORM 一样不擅长处理复合主键。如果你看到它有
的代码protected function setKeysForSaveQuery(Builder $query)
{
$query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery());
return $query;
}
public function getKeyName()
{
return $this->primaryKey;
}
由于您似乎有一个复合主键,它将只使用其中的第一个字段,因此用户的所有字段都将被更新。
推荐的选项是在映射表上也为主键添加一个id字段,或者如果你像我一样不想添加冗余字段,你可以使用
UserFields::where(['user_id' => $user['user_id'], 'field_id' => 'myfield'])->update(['field_value', "new value"]);
或
DB::table('user_fields')->where(['user_id' => $user['user_id'], 'field_id' => 'myfield'])->update(['field_value', "new value"]);
编辑:
对于任何感兴趣的人,我确实找到了我以前使用过的解决方案。在模型中,您可以像这样重载 setKeysForSaveQuery
函数
protected function setKeysForSaveQuery(Builder $query) {
$query->where('firstPKcolumn', $this->getAttribute('firstPKcolumn'))->where('otherPKcolumn', $this->getAttribute('otherPKcolumn'));
return $query;
}
然后你可以在模型上正常使用save
对于遇到相同问题的任何人,我设法使用基本的流明数据库查询方法解决了这个问题:
app('db')->update("UPDATE `xf_user_field_value` SET `field_value` = ? WHERE (user_id = ? AND field_id = ?);", [ $newValue, $user_id, $column ]);
我已经完全禁用 Eloquent,因为它对我来说太过分了,而且不够灵活,无法满足我的需求。