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

Php 流明与雄辩任意改变所有领域,php,laravel,eloquent,lumen,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(); } 突然,该表中的所有行字段\u值都更改为新值,并且仅针对该用户 这真让人困惑,我不知道这是否是Eloquent中的一个bug。Larav

代码如下:

$row = UserFields::where(['user_id' => $user['user_id'], 'field_id' => 'myfield'])->first();
if($row)
{
    $row->field_value = "new value";
    $row->save();
}
突然,该表中的所有行
字段\u值
都更改为新值,并且仅针对该用户


这真让人困惑,我不知道这是否是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"]);

编辑:

对于任何感兴趣的人,我确实找到了我以前使用过的解决方案。在模型中,您可以像这样重载
setKeysForSaveQuery
函数

protected function setKeysForSaveQuery(Builder $query) {
    $query->where('firstPKcolumn', $this->getAttribute('firstPKcolumn'))->where('otherPKcolumn', $this->getAttribute('otherPKcolumn'));

    return $query;
}

然后您可以在模型上使用
正常保存

为任何有相同问题的人保存,我通过使用基本lumen db查询方法解决了这个问题:

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

我已经完全禁用了Eloquent,因为它对我来说太过分了,而且不够灵活,不能满足我的需要。

所有行和“仅限该用户”听起来有点混乱。您能详细说明一下吗?您使用的是什么数据库连接?有一个
保存
模型事件?@apokryfos行结构有3个字段
用户id
字段id
字段值
,它的所有用户数据都由
用户id
@Dmitry使用MySQLLet重新表述为:(a)用户的所有3个字段
$user['user\u id']
更改为“新值”或(b) 表中的所有行都将其
字段值更新为“新值”?还有其他选项吗?因为我正在为我的Xenforo论坛制作一个API,我不能简单地更改表结构。您可以使用update()手动执行更多操作。实际上,在您的情况下,我会使用UserFields::where(['user\u id'=>$user['user\u id'],'field\u id'=>'myfield'])->update('field\u value',“new value”);太棒了!这就成功了,但是你错过了一部分,你必须向该方法传递一个数组,更新你的答案,我将接受它作为解决方案。再次感谢!这似乎有点奏效,但几次尝试后仍然是相同的结果。无论如何,我想我必须使用基本的lumen db查询。
app('db')->update("UPDATE `xf_user_field_value` SET `field_value` = ? WHERE (user_id = ? AND field_id = ?);", [ $newValue, $user_id, $column ]);