雄辩的任意改变所有领域的流明

时间:2016-06-27 08:58:15

标签: php laravel eloquent lumen

以下是代码:

$row = UserFields::where(['user_id' => $user['user_id'], 'field_id' => 'myfield'])->first();
if($row)
{
    $row->field_value = "new value";
    $row->save();
}

突然,该表中的所有行field_value都更改为新值,仅适用于该用户!

这真令人困惑,我不知道它是否是Eloquent中的一个错误。

2 个答案:

答案 0 :(得分:1)

Laravel雄辩,就像许多其他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

答案 1 :(得分:0)

对于任何有相同问题的人,我设法通过使用基本的流明数据库查询方法来解决这个问题:

app('db')->update("UPDATE `xf_user_field_value` SET `field_value` = ? WHERE (user_id = ? AND field_id = ?);", [ $newValue, $user_id, $column ]);

我完全禁用了Eloquent,因为它对我来说太过分了,而且对我的需求不够灵活。