【发布时间】:2011-07-13 19:19:09
【问题描述】:
我正在尝试级联保存一些用户:
$user = new User();
$user->name = 'xxx';
$user->location->id = 1;
$user->location->name = 'yyy';
$user->save;
$user2 = new User();
$user2->name = 'zzz';
$user2->location->id = 1;
$user2->location->name = 'yyy';
$user2->location->zip = '123456';
$user2->save;
在这种情况下,我希望 Doctrine 足够聪明并更新位置 1,因为我正在更改 id 1 的内容,但我所拥有的是另一个插入。 我尝试在 User 中使用 preSave() 方法解决问题:
public function preSave( Doctrine_Event $event )
{
$invoker = $event->getInvoker();
if ( /...decide to UPDATE the record .../ )
{
$invoker->state( Doctrine_Record::STATE_DIRTY );
}
else
{
$invoker->state( Doctrine_Record::STATE_CLEAN );
}
}
但是当学说尝试更新时,它没有标识符并产生此错误:
Doctrine_Connection_Mysql_Exception: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
这不是 Doctrine 应该提供的开箱即用的东西吗?我在这里错过了什么吗?为什么我需要手动实现此行为?
补充说明
我们有 3 种情况决定记录是应该插入、更新还是简单关联:
1
- 我们数据库的全新用户 - 应该插入
- 我们数据库的全新位置 - 应插入
2
- 我们数据库的全新用户 - 应该插入
- 现有位置 - 应链接到用户记录
3
- 我们数据库的全新用户 - 应该插入
- 现有位置 ID,更新数据 - 应更新并链接到用户记录
我们需要找到最有效的方法来做到这一点。显然我们可以在 preSave() 等中进行大量选择,我们只需要充分利用 Doctrine
【问题讨论】:
-
您确定位置表中“id”上的主键存在并且在模型类中正确写入了吗?你能提供模型类的代码吗?需要带有表格和关系描述的部分。
-
$this->hasColumn('location_id', 'integer', 8, array('type' => 'integer', 'length' => 8, 'fixed' => false, '无符号' => false, 'primary' => true, 'autoincrement' => false, ));
-
您在代码中引用字段“id”,而不是字段“location_id” - 为什么它应该工作?
标签: php orm doctrine save doctrine-1.2