Doctrine,确实有时很麻烦!
August 13, 2009 – 10:07 pm最近一直在使用symfony + Doctrine,碰到两个问题,困扰了1天时间,记录在这里。
场景1: 运行代码如下:
- $query = new Table();
- foreach ($array as $key => $value)
- {
- $query->field1 = $value['field1'];
- $query->field2 = $value['field2'];
- $query->save();
- }
结果倒好,$array里有7个记录需要插入,结果变成了最后一条插入,其他的不知所踪。(中间省略了查资料,改配置的文字… …)最后我实在想不出哪里出问题了,干脆,打开doctrine的源代码,找到unitofwork.php(symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection),在function saveGraph()的$this->insert($record)和$this->update($record)各加入中断代码,看看到底怎么回事。等结果打印在屏幕上了,我马上明白了,代码执行成了一次插入,后面紧跟六次修改记录,无怪乎只有最后一条记录了。现在修改代码如下,执行正常了。
- foreach ($array as $key => $value)
- {
- $query = new Table();
- $query->field1 = $value['field1'];
- $query->field2 = $value['field2'];
- $query->save();
- }
场景2:插入一条记录后,可以获取last insert id,在网上找了doctrine的资料,说$obj->save();后执行$obj->id;即可获取last insert id,实际中却只能获取一个空数组,又是一顿解决问题(省略查资料,改配置的文字… …),最后发现这里耽误的时间过多了,干脆,把doctrine源代码record.php(symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine)和unitofwork.php(symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection)都改了,直接让$obj->save()返回last insert id搞定,先暂时这样吧,或许以后能找到不动doctrine源代码的解决办法。
2 Responses to “Doctrine,确实有时很麻烦!”
1. ORM 的本義正是如此,一個 object 代表一個紀錄。
2. 似乎您是忘了在 Table 中的 Primary Key 欄加上 ‘autoincrement’ => true 的定義。
By tamcy on Aug 16, 2009
Doctrine::getTable(”Table”)->create($cdataArr);
By ben on Oct 16, 2009