【问题标题】:Symfony2 EntityManager Updating without persistSymfony2 EntityManager 更新没有持久化
【发布时间】:2018-01-14 10:01:29
【问题描述】:

正如你在下面看到的,我根本不“坚持”。但我所做的更改正在注册。非常感谢您的帮助。

$entityManager = $this->getDoctrine()->getManager(); $entity = $entityManager->getRepository(City::class)->find(1); $entity->setName("debug name"); $entityManager->flush();

【问题讨论】:

  • 我没有看到任何问题,因为您正在做的是一个更新过程。您不必调用persist 来触发更新,因为您已经调用了flush。 Described here
  • $em->refresh($entity) 基本上会撤消自上次检索以来对 $entity 所做的任何更改。

标签: symfony doctrine entitymanager


【解决方案1】:

你必须在初始化一个新对象时调用方法persist(),比如new City()。当您使用 find() 从数据库中获取对象时,它已经有一些元数据。


From doctrine website:

Doctrine 使用身份映射模式来跟踪对象。每当你 从数据库中获取一个对象,Doctrine 将保留一个对 这个对象在它的 UnitOfWork 中。包含所有实体的数组 引用是两级深度,并具有键“根实体名称”和 “身份证”。

这里是教义的例子:

当你调用EntityManager#flush Doctrine 会询问身份映射 对于当前管理的所有对象。这意味着你没有 一遍又一遍地调用 EntityManager#persist 来传递已知 EntityManager 的对象。这是已知实体的 NO-OP,但是 导致编写的许多代码让其他开发人员感到困惑。

以下代码将使用所做的更改更新您的数据库 Person 对象,即使您没有调用 EntityManager#persist:

<?php
$user = $entityManager->find("Person", 1);
$user->setName("Guilherme");
$entityManager->flush();

【讨论】:

    【解决方案2】:

    从存储库加载找到的实体后,只需将其分离

    $entity = $entityManager->getRepository(City::class)->find(1);    
    $entityManager->detach($entity);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2016-10-04
      相关资源
      最近更新 更多