教义坚持+坚持=插入+插入?
Posted
技术标签:
【中文标题】教义坚持+坚持=插入+插入?【英文标题】:doctrine persist + persist = insert + insert? 【发布时间】:2013-02-16 12:49:13 【问题描述】:我的项目中有一个简单的实体,如下所示:
$obj = Entity\ImportResume();
$obj->setStatus(1);
$em->persist($obj);
$em->flush();
$em->clear();
$obj->setStatus(2);
$em->persist($obj);
$em->flush();
$em->clear();
但是教义执行 2 次插入,我需要 1 次插入和 1 次更新。
观察:
如果我在第一次持久化后执行 var_dump($obj),我的 id fileld 将被数据库 id 填充! 对我来说,学说忽略了第二个坚持的 id,为什么?有什么帮助吗?
【问题讨论】:
【参考方案1】:如果我正在阅读 Doctrine Docs 正确的 persist
,则仅在初始 INSERT
上需要。
本段建议只需更改对象然后刷新存储就足够了:
7.3. Persisting entities
因此,当调用 EntityManager#flush() 时,此类实体的持久状态随后将与数据库正确同步。
还有:
7.7.2. Synchronizing New and Managed Entities
刷新操作适用于具有以下语义的托管实体:
实体本身使用 SQL UPDATE 语句同步到数据库,前提是至少有一个持久性字段已更改。 如果实体未更改,则不会执行任何 SQL 更新。
【讨论】:
【参考方案2】:我不知道原因是:$em->clear();
clear 方法清除所有实体的状态,并导致 Entity Manager 上的 id 丢失。
解决办法:
移除 $em->clear();
感谢蒂姆沃拉!
【讨论】:
【参考方案3】:如果是同一个objetc,你可以这样做
$em->persist($obj);
$obj->setStatus(1);
$obj->setStatus(2);
$em->flush();
如果是 2 个不同的对象
$obj1 = Entity\ImportResume();
$obj1->setStatus(1);
$em->persist($obj1);
$obj2 = Entity\ImportResume();
$obj2->setStatus(2);
$em->persist($obj2);
$em->flush();
仅当需要在相同代码中重新启动进程时才使用“清除”方法。
【讨论】:
以上是关于教义坚持+坚持=插入+插入?的主要内容,如果未能解决你的问题,请参考以下文章
在插入之前分配 NSManagedObject 属性不会坚持
DBUnit 坚持为未指定的值插入 null,但我希望使用 DB 默认值