正如您在下面所见,我根本没有“坚持”。但我所做的改变是注册。我很感激你的帮助。
$entityManager = $this->getDoctrine()->getManager();
$entity = $entityManager->getRepository(City::class)->find(1);
$entity->setName("debug name");
$entityManager->flush();
答案 0 :(得分:7)
初始化新对象时必须调用方法persist()
,例如new City()
。当您使用find()
从数据库中获取对象时,它已经有一些元数据。
来自学说网站
Doctrine使用Identity Map模式跟踪对象。无论何时你 从数据库中获取一个对象,Doctrine将保留对它的引用 UnitOfWork中的这个对象。包含所有实体的数组 引用是两级深度,并具有键“根实体名称”和 “ID”。
以下是来自学说的例子:
当你调用EntityManager #flush时,Doctrine会询问身份图 对于当前管理的所有对象。这意味着你没有 调用EntityManager#一遍又一遍地传递已知的 对象到EntityManager。这是已知实体的NO-OP,但是 导致编写的代码很多,这让其他开发人员感到困惑。
以下代码将使用所做的更改来更新您的数据库 Person对象,即使你没有调用EntityManager#persist:
<?php
$user = $entityManager->find("Person", 1);
$user->setName("Guilherme");
$entityManager->flush();
了解更多here
答案 1 :(得分:0)
只需在从存储库加载找到的实体后分离它
$entity = $entityManager->getRepository(City::class)->find(1);
$entityManager->detach($entity);