2

我的项目中有一个简单的实体,如下所示:

$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,为什么?

有什么帮助吗?

4

3 回答 3

1

如果我正在阅读 Doctrine Docs,persist则仅需要在初始INSERT.

本段建议只需更改对象然后刷新存储就足够了:

7.3. 持久实体

因此,当调用 EntityManager#flush() 时,此类实体的持久状态随后将与数据库正确同步。

并进一步:

7.7.2. 同步新实体和托管实体

刷新操作适用于具有以下语义的托管实体:

  • 实体本身使用 SQL UPDATE 语句同步到数据库,前提是至少有一个持久性字段已更改。
  • 如果实体未更改,则不会执行任何 SQL 更新。
于 2013-02-16T13:04:35.947 回答
0

我不知道原因是: $em->clear();

clear 方法清除所有实体的状态,并导致实体管理器上的 id 丢失。

解决办法:

删除 $em->clear();

谢谢蒂姆沃拉!

于 2013-02-18T12:42:48.660 回答
0

如果它是同一个 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();

仅在必要时使用“清除”方法在同一代码中重新启动进程。

于 2015-07-10T16:57:23.637 回答