我不确定如何使用活动记录或使用手动 sql 来处理这个问题。我想要做的是将记录添加到具有自动递增 id 的“联系人”表中,然后将具有相应“联系人”记录 id 的 id 的记录添加到“订单”表中。
我知道我可以使用 $this->db->insert_id() 获取插入的联系人记录的 ID,但这仅在使用活动记录时有效吗?
另外,我可以在一个查询中实现这种类型的插入,还是必须将其分成两部分?
我不确定如何使用活动记录或使用手动 sql 来处理这个问题。我想要做的是将记录添加到具有自动递增 id 的“联系人”表中,然后将具有相应“联系人”记录 id 的 id 的记录添加到“订单”表中。
我知道我可以使用 $this->db->insert_id() 获取插入的联系人记录的 ID,但这仅在使用活动记录时有效吗?
另外,我可以在一个查询中实现这种类型的插入,还是必须将其分成两部分?
$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();
根据 Codeigniter 的说法,它$this->db
被命名为“Active Record”[原文如此!] 所以你已经用这些术语回答了你自己的问题。否则,您需要通过编写"Active Record"来实际指定您的意思。
在 PHP 中,Mysqli 扩展提供了一次运行多个查询:mysqli::multi_query
Docs。
最后一个插入 ID 函数也存在于 Mysql 本身中,可以在任何 SQL 查询中使用,它被称为LAST_INSERT_ID()
Mysql Docs。
INSERT INTO contact;
INSERT INTO order SET contact_ID = LAST_INSERT_ID();
也许这就是您正在寻找的信息。
附加信息
不要忘记检查交易是否成功:
$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>";
}