首页 > 解决方案 > Codeigniter 4 使用 save() 更新到数据库

问题描述

我尝试使用 save() 更新到我的数据库中。由于我的主键是一个自动增量 ID,因此当我尝试使用 save() 时它会创建一个新行。

我尝试使用 save($game_id, $newData) 进行测试,但收到错误消息。

下面是我的代码:

表 add_game

id | game_id | user_id | ign  | acc_id
1  | 3       | 1       | ignA | accA
2  | 3       | 1       | ignB | accB
3  | 3       | 1       | ignC | accC

模型

protected $table = 'add_game';
    protected $allowedFields = [
        'user_id',
        'game_id',
        'ign',
        'acc_id'
    ];

控制器

$newData = [
                    'user_id' => session()->get('user_id'),
                    'game_id' => $game_id,
                    'ign' => $this->request->getVar('ign'),
                    'acc_id' => $this->request->getVar('acc_id')
                ];
    
                $model->save($newData); // currently it keeps creating new record
                $model->save($newData); // return me error message 

如何更新现有记录?我想根据我的 user_id 和 game_id 更新它们。提前谢谢各位!

标签: codeignitercodeigniter-4

解决方案


您需要定义一个主键才能进行save()更新。在您的示例中,此主键应该/必须是id

节省()

这是对 insert() 和 update() 方法的封装,根据是否找到与 $primaryKey 值匹配的数组键,自动处理插入或更新记录:

由于您没有提及 id,因此显然插入了一条新记录并且未更新。

为了更新,您需要提供唯一的 $primaryKey:

// Performs an update on id=3, since the primary key, 'id', is found.
$newData = [
    'id'       => 3,
    'user_id' => session()->get('user_id'),
    'game_id' => $game_id,
    'ign' => $this->request->getVar('ign'),
    'acc_id' => $this->request->getVar('acc_id')
];
$model->save($newData);

无需重复最后一行 ( $model->save($newData);),这总是会带来麻烦/错误

来自 CI 4.x 文档:保存数据

了解您在此处找到的基础 SQL 查询的重要读物:INSERT ON DUPLICATE KEY UPDATEhttps://mariadb.com/kb/en/insert-on-duplicate-key-update/等等


推荐阅读