在CodeIgniter 4中如何在保存到数据库后获取插入ID?

13
我正在使用Codeigniter 4。
像这样插入新数据,
$data = [
        'username' => 'darth',
        'email'    => 'd.vader@theempire.com'
];

$userModel->save($data);

在这里提到了:CodeIgniter的Model参考

它正在进行插入。 但是我没有找到任何关于在插入后获取插入id的参考。

请帮忙!先行致谢。


1
以下是一些关于插入操作的示例,包括获取最后插入的ID。参考链接:https://dev59.com/gmQn5IYBdhLWcg3w9K_3。希望对你有帮助。 - nbk
1
这个回答是否解决了你的问题?如何在CodeIgniter Active Record中插入查询后获取最后一个插入的ID? - Andy Donegan
很遗憾,对我来说什么都没有起作用 :( 谢谢 - Encrypted
10个回答

17

这也有效。

       $user= new UserModel();

        $data = [
                 'username' => 'darth',
                  'email'    => 'd.vader@theempire.com'
              ];

        $user->insert($data);
        $user_id = $user->getInsertID();

确实可以使用 getInsertID() 方法,但我认为它也应该与 save() 方法一起使用。 - Melroy van den Berg

11

在研究CI 4框架的核心后,我得到了一个简单的解决方案。

$db = db_connect('default'); 
$builder = $db->table('myTable');

$data = [
        'username' => 'darth',
        'email'    => 'd.vader@theempire.com'
];

$builder->insert($data);
echo $db->insertID();

希望他们很快在文档中添加清晰的描述。

3
在CodeIgniter 4.2.1版本的查询构建器类中,它无法正常工作。 - MdFarzan
你能告诉我应该使用什么吗? - user3209031

4

在ci4中获取ID有三种方式:

$db = \Config\Database::connect();
$workModel = model('App\Models\WorkModel', true, $db);
$id = $workModel->insert($data);
        
echo $id;
echo '<br/>';
echo $workModel->insertID(); 
echo '<br/>';
echo $db->insertID();

2

实际上,您的操作是正确的。 您按照Codeigniter 4模型使用指南以最佳和最简单的方式执行了该操作。

您只是遗漏了:$id = $userModel->insertID;

使用您的示例完成代码:

$data = [
        'username' => 'darth',
        'email'    => 'd.vader@theempire.com'
];

$userModel->save($data);

$id = $userModel->insertID;

就是这样。如果您正在使用CodeIgniter的模型,则不需要来自上面示例的所有代码,也不需要调用数据库服务或db builder。

已在2021年3月19日测试了CodeIgniter 4.1.1


谢谢!不过我认为应该是 $userModel->getInsertID() - Melroy van den Berg
根据 CodeIgniter 4 的官方文档,@MelroyvandenBerg,请查看:https://codeigniter.com/user_guide/database/helpers.html#db-insertid,它应该是 insertID。 - Felipe Lima
不,那是数据库对象上的内容。我们现在讨论的是ci4中的(用户)模型对象。 - Melroy van den Berg
我不明白你的意思。我的回答对你没有用吗?因为我在codeigniter 4中进行了测试。 我甚至很好奇,因为我在文档中没有看到getInsertID函数,但最终我在以下链接找到了它: https://codeigniter4.github.io/CodeIgniter4/models/model.html 无论如何,在system/BaseModel.php的BaseModel第686行中,getInsertID()函数返回...insertID。看:return is_numeric($this->insertID) ? (int) $this->insertID : $this->insertID;我的回答有错误吗?最好 - Felipe Lima
它并不完全错误,但我认为这是一个受保护的变量。虽然 getInsertID() 由于某种原因没有文档说明,但这个函数是公共的,可以在模型类上使用。 - Melroy van den Berg

0
$Record_New_Data = array(
 'OWNER_ID' => 'some_id_value',
 'NAME' => 'some_name_value',
);
        
$db = db_connect();
$db->table('MY_TABLE')->insert($Record_New_Data);

if(!$My_newly_inserted_ID = $db->insertID()){
  die("There was an error inserting a record.");
}
    
echo "My insert ID = $My_newly_inserted_ID";

0

我正在使用mysql作为我的数据库,然后我在我的seeder中运行了这个命令

$university = $this->db->table('universities')->insert([
    'name' => 'Harvard University'
]);
$faculty = $this->db->table('faculties')->insert([
    'name' => 'Arts & Sciences',
    'university' => $university->resultID
]);

看一下第6行代码

$university->resultID

这里的变量$universityCodeIgniter\Database\MySQLi\Result类的对象类型。

如果我有任何错误或需要改进,请纠正我。


在我的情况下返回错误“尝试获取非对象的属性'resultID'” - taufardh

0

大家好,我的情况是我使用ci模型来保存数据,我的代码是:

 $x=new X();
 $is_insert= $x->save(['name'=>'test','type'=>'ss']);
 if($is_insert)
     $inserted_id=$x->getInsertID()

0

对于CI4

$settings = new SettingsModel();
$settingsData = $settings->find(1);

<?php namespace App\Models;

use App\Models\BaseModel;

class SettingsModel extends BaseModel
{
    protected $table      = 'users';
    protected $primaryKey = 'id';
}

$settings->find(1); 将返回一行数据。它将查找 $primaryKey 提供的值。


0
为了解决这个问题,我在save()方法中修改了system/Model.php文件。
$response = $this->insert($data, false);

// add after the insert() call 
$this->primaryKey = $this->db->insertID();

现在,在您的模型中,您只需引用"$this->primaryKey",它将为您提供所需的信息,同时保持数据建模功能。

我将提交此内容给CI开发人员,希望能够添加进去。


-1

我曾经遇到过同样的问题,但不幸的是,CI4文档并没有提供太多帮助。使用构建器的解决方案可以工作,但这只是绕过数据建模的一种方法。我相信你想要一个纯粹的模型解决方案,否则你也不会提出这个问题。

$data = [
        'username' => 'darth',
        'email'    => 'd.vader@theempire.com'
];

$id = $userModel->save($data);

尝试了我能想到的一切后,我决定存储保存方法的结果,以查看它是否返回一个布尔值来指示保存是否成功。检查变量后,我意识到它恰好返回了我想要的:丢失的insertID。
我认为CodeIgniter 4是一个相当简单而又有能力的框架,在共享主机上做得很好,而其他框架可能会有点苛刻,如果你正在学习,但缺乏与CI3相同的出色文档和示例。希望这只是暂时的。
顺便说一下,你的代码仅在您在模型本身之外使用$userModel时才有效,例如从控制器中。您需要创建一个模型对象,如下所示:
$userModel = New WhateverNameModel();
$data = [any data];
$userModel->save($data);

或者,如果您正在模型内部编写方法(我最喜欢的方式),则应编写

$this->save($data);

感谢您的贡献。但是我已经修复了上一个答案中添加的问题。 - Encrypted
感谢您的认可。事实上,您的解决方案确实能够胜任工作,并且是一个非常好的、完全正确的解决方案。我只是想澄清一下,对于相同的情况,还有一种纯建模方法。事实上,我仍在学习并尝试理解CI4带来的几个新概念,我相信这些概念将成为该框架未来发展的方向。 - Luiz Guilherme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接