doctrine persist + persist = insert + insert?

时间:2013-02-16 12:49:13

标签: php doctrine

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

$obj = Entity\ImportResume();
$obj->setStatus(1);

$em->persist($obj);
$em->flush();
$em->clear();

$obj->setStatus(2);

$em->persist($obj);
$em->flush();
$em->clear();

但是学说performe 2插入,我需要1次插入和1次更新。

Obs:

  • 如果我在第一次持久化后执行var_dump($ obj)我的id fileld中填充了数据库ID!
  • 对我来说,教义是忽略第二个持续存在的身份,为什么?

任何帮助?

3 个答案:

答案 0 :(得分:1)

如果我正在阅读Doctrine文档,则只需要persistINSERT。{/ p>

本段建议只需更改对象然后刷新存储即可:

7.3. Persisting entities

  

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

并进一步:

7.7.2. Synchronizing New and Managed Entities

  

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

     
      
  • 仅当至少有一个持久字段发生更改时,才使用SQL UPDATE语句将实体本身同步到数据库。
  •   
  • 如果实体未更改,则不会执行SQL更新。
  •   

答案 1 :(得分:0)

我贬低原因是:$ em-> clear();

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

Solucion:

删除$ em-> clear();

感谢TimWolla!

答案 2 :(得分:0)

如果它是相同的对象,你可以做

$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();

只有在必要时才使用'clear'方法在同一代码中重启进程。