【问题标题】: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,为什么?

有什么帮助吗?

【问题讨论】:

    标签: php doctrine


    【解决方案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();
        

        仅当需要在相同代码中重新启动进程时才使用“清除”方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多