教义坚持+坚持=插入+插入?

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 默认值

坚持Doctrine2时如何跳过列?

以编程方式定位 UIView 不起作用 - 坚持情节提要定位

坚持使用 prisma1 模式设计和数据迁移

每天坚持做一件事真的很难