【问题标题】:How to get insert id after save to database in CodeIgniter 4如何在 CodeIgniter 4 中保存到数据库后获取插入 ID
【发布时间】:2020-07-23 10:35:27
【问题描述】:

我正在使用 Codeigniter 4。

并像这样插入新数据,

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

$userModel->save($data);

这里提到:CodeIgniter’s Model reference

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

请帮忙!提前致谢。

【问题讨论】:

标签: php mysql codeigniter-4


【解决方案1】:

这也有效。

       $user= new UserModel();

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

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

【讨论】:

    【解决方案2】:

    研究了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】:

      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();
      

      【讨论】:

        【解决方案4】:

        为了克服这个问题,我在 save() 方法中修改了 system/Model.php ---

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

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

        我将把它提交给 CI 开发人员,希望它会被添加进来。

        【讨论】:

          【解决方案5】:

          对于 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 提供的值。

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              我将 mysql 用于我的数据库,然后我在播种机中运行它

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

              查看第 6 行代码

              $university->resultID
              

              变量$university这里是CodeIgniter\Database\MySQLi\Result类的类型对象

              如果我错了或有任何改进的余地,请纠正我

              【讨论】:

              • 在我的情况下返回错误“尝试获取非对象的属性'resultID'”
              【解决方案8】:

              其实你做的是对的。 您按照 Codeigniter 4 模型使用指南以最佳和最简单的方式进行了操作。

              你刚刚错过了:$id = $userModel-&gt;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 上测试

              【讨论】:

                【解决方案9】:

                我遇到了同样的问题,但不幸的是,CI4 文档并没有多大帮助。使用构建器的解决方案可以解决,但它是数据建模的一种解决方法。我相信您想要一个纯模型解决方案,否则您不会问。

                $data = [
                        'username' => 'darth',
                        'email'    => 'd.vader@theempire.com'
                ];
                
                $id = $userModel->save($data);
                

                尝试了我能想到的一切,我决定存储 save 方法的结果,看看是否返回一个布尔值来指示保存是否成功。检查变量后,我意识到它返回的正是我想要的:丢失的 insertID。

                我相信 CodeIgniter 4 是一个相当简单且功能强大的框架,它在共享主机中做得不错,如果您正在学习其他框架可能会有点要求,但缺乏同样出色的 CI3 文档和示例。希望这只是暂时的。

                顺便说一句,只有在模型本身之外使用 $userModel 时,您的代码才有效,例如,来自控制器。您需要创建一个模型对象,例如:

                $userModel = New WhateverNameModel();
                $data = [any data];
                $userModel->save($data);
                

                或者,如果你在模型本身内部编写一个方法(我最喜欢的方式),你应该写

                $this->save($data);
                

                【讨论】:

                • 感谢您的贡献。但我已经解决了我在上一个答案中添加的这个问题。
                • 感谢您的认可。事实是,您的解决方法确实可以完成工作,并且确实是一个很好且完全正确的解决方案。我只是想澄清一下,对于同样的情况,有一种纯粹的建模方法。事实上,我仍在学习并试图理解 CI4 附带的几个新概念,我相信它们将成为该框架发展的未来。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-09-15
                相关资源
                最近更新 更多