CakePHP,从db表中获取记录的id

时间:2013-08-07 14:42:35

标签: database cakephp

我知道从id中的record获取db table的{​​{1}}非常简单。我希望得到一个表的“未来”CakePHP的“未来”id,也就是说,我会插入一个record,但在插入之前,我想得到它id,将在插入完成后由db生成(record为int,Auto Increment)。感谢。

2 个答案:

答案 0 :(得分:4)

即使数据库本身也不知道在保存记录之后的那一刻它将使用什么ID。

您不能(在多用户系统中)提前询问ID将会是什么,因为在您询问ID的位置和插入时间之间可能插入了20条其他记录你的记录(使用过去20个记录的ID。)这称为“种族条件”。

以下是将要发生的事情:

You: DB - what's the next ID please?
DB: (Does a max() on the column) 21!
You: Great! I'll use that!

(meanwhile 20 other records get inserted by other users)

You: Hi DB, I'd like to insert this record using ID 21 like you told me!
DB: Oops - sorry - that ID has already been used :'-(

您无需事先知道该记录。如果正确构建保存数据并使用CakePHP的saveAccociated()方法,CakePHP将插入正确的ID作为所有相关数据的外键值。

拥有可预测ID的唯一方法是自己创建它。记住 - 它必须是非null且唯一的(主键的定义)。

保存自己许多未来的主键冲突并坚持蛋糕方法: - )

答案 1 :(得分:1)

一个选项是你可以从mysql获取当前的最大id,然后只增加值。如果您正在进行大量操作,可能会导致您的网站出现问题。但你可以使用:

$this->Model->query("SELECT MAX(id) as max FROM `your_table_name`");

这样可以获得该表的最大ID,然后您可以执行+1

另一种选择是在保存后获取ID,然后使用该ID更新记录。例如,cakephp有一个方法。

$this->Model->getLastInsertID();
$this->Model->updateAll($fields, $conditions)

参考updateAll:http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-array-conditions