【问题标题】:codeigniter 2.0 inserting records in two tables at oncecodeigniter 2.0一次在两个表中插入记录
【发布时间】:2012-09-17 16:26:25
【问题描述】:

我不确定如何使用活动记录或使用手动 sql 来处理这个问题。我想要做的是将记录添加到具有自动递增 id 的“联系人”表中,然后将具有相应“联系人”记录 id 的 id 的记录添加到“订单”表中。

我知道我可以使用 $this->db->insert_id() 获取插入的联系人记录的 ID,但这仅在使用活动记录时有效吗?

另外,我可以在一个查询中实现这种类型的插入,还是必须将其一分为二?

【问题讨论】:

  • 您使用的是哪种类型的数据库?您可以创建一个存储过程,通过一次调用 DB 来执行多个步骤。

标签: php mysql codeigniter


【解决方案1】:

$this->db 不是指 Active Record。一定要选择使用Active Record,$this->db只是指数据库抽象层。

也就是说,您可以在查询后立即使用$this->db->insert_id()(无论是否为 Active Record)来获取其插入 ID。

但是为了处理一次插入多个依赖于彼此 ID 的记录,我会切换到 InnoDB 作为您的表类型(如果您还没有)并使用 CodeIgniter 的transactions

这是一个示例,改编自 CodeIgniter 的文档:

$this->db->trans_start();

$this->db->query('INSERT INTO table1 VALUES(id,field1,field2)');
$table1_id = $this->db->insert_id();

$this->db->query('INSERT INTO table2 VALUES(id,' . $table1_id . ',field2,field3)');

$this->db->trans_complete(); 

【讨论】:

    【解决方案2】:

    根据 Codeigniter 的说法,$this->db 被命名为“Active Record”[原文如此!] 所以你已经用这些术语回答了你自己的问题。否则,您需要通过编写“Active Record”来实际指定您的意思。

    在 PHP 中,Mysqli 扩展提供一次运行多个查询:mysqli::multi_queryDocs

    最后一个插入ID函数也存在于Mysql本身中,可以在任何SQL查询中使用,称为LAST_INSERT_ID()Mysql Docs

    INSERT INTO contact;
    INSERT INTO order SET contact_ID = LAST_INSERT_ID();
    

    也许这就是您要查找的信息。

    【讨论】:

      【解决方案3】:

      附加信息

      别忘了检查交易是否成功:

      $this->db->trans_complete();
      
          if($this->db->trans_status() === FALSE){// Check Transaction Result successful                          
               echo "<br>------- INFO WAS >>>>>>> NOT INSERTED <<<<<<< -------<br>";
          }else{
               echo "<br>------- >>>>>>> TRANSACTION SUCCESSFUL <<<<<<< -------<br>";
          }
      

      【讨论】:

        猜你喜欢
        • 2016-03-26
        • 1970-01-01
        • 2016-07-07
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多