【问题标题】:Codeigniter 4 update into database with save()Codeigniter 4 使用 save() 更新到数据库
【发布时间】:2020-09-01 22:05:14
【问题描述】:

我尝试使用 save() 更新到我的数据库。由于我的主键是一个自动递增的 id,所以当我尝试使用 save() 时它会创建一个新行。

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

下面是我的代码:

表添加游戏

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 更新它们。提前谢谢各位!

【问题讨论】:

  • 至少,您需要发布错误的实际情况以及该表的实际架构(不是示例行,表的实际定义方式),以便能够为您提供帮助。跨度>

标签: codeigniter codeigniter-4


【解决方案1】:

您需要定义一个主键以使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 文档:Saving Data

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

【讨论】:

  • 您好 Vickel,我知道我需要定义一个主键。我必须根据 user_id 和 game_id 进行更新才能相应地更新,所以我无法定义主键。有没有办法使用 save() 来做到这一点?或者我只能使用 update()?
  • 表add_game 中的id 似乎是唯一的,将其更改为cPanel 的phpMyAdmin 中的主键。 save() 也用于插入(新行)或更新(现有行),如果你只是更新,从不插入,显然使用 update()
  • 只是好奇和题外话,因为大多数应用程序只有 insert() 或 update(),所以我们可以在什么样的场景中使用 save()?我真的想不出来。
  • 假设您有一个新用户并编辑用户表单。这种形式可能是一样的。当您使用名称电子邮件等填写数据并将电子邮件设置为唯一索引时,如果电子邮件不存在,它将插入新用户或使用匹配的电子邮件更新用户。如果您阅读了我的答案中的链接,您会发现底层的 sql 查询
  • 这是查询生成器的经典方式,非常适合更新。用它。它不会“插入重复更新”,这是您最初关于 save() 的问题,但如果您只想更新,这是经典的方法。
【解决方案2】:

在 codeigniter 4 save() 方法可以根据您提供的数据进行插入和更新

如果您想更新到 add_game 表,请在您的表中添加您要更新的数据的 id

$newData = [
           'id' => 1 //add data id here
           '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);  

【讨论】:

  • 嗨 Nadim,是的,我知道 ID thingy,但问题是因为我不知道哪个 ID,所以我的更新条件是基于用户 ID 和游戏 ID。
猜你喜欢
  • 2020-07-12
  • 2013-02-26
  • 2021-09-20
  • 2016-02-05
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多