3

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

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

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

4

3 回答 3

3

$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(); 
于 2012-09-17T17:18:56.710 回答
1

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

也许这就是您正在寻找的信息。

于 2012-09-17T16:33:55.493 回答
0

附加信息

不要忘记检查交易是否成功:

$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>";
    }
于 2013-07-22T00:08:57.567 回答