原则2从实体更新

问题描述

| 是否可以通过以下类似方式更新实体:
$data       = new ATest();  // my entity
$data->id   = 1;            // id 1 already exists,I just want to update this row
$data->name = \"ORM Tested\"; // changed the name

$entityManager->persist($data);
$entityManager->flush();
这将插入并更改对象的ID,而不是更新数据库中的现有行。     

解决方法

您应该调用merge而不是persist:
$data = new MyEntity();
$data->setId(123);
$data->setName(\'test\');

$entityManager->merge($data);
$entityManager->flush();
    ,我不得不用
$entityManager->merge($data)
    ,或者只是获取托管实体,而不是空实体。
$data = $entityManager->getRepository(\'ATest\')->findOne(1); // ATest is my entitity class
$data->name = \"ORM Tested\"; // just change the name

$entityManager->persist($data);
$entityManager->flush();
如果该实体已经被管理,则persist()将对其进行更新,而不是插入一个新实体。     ,您也可以使用
getReference
通过标识符更新实体属性,而无需检索数据库状态。 https://www.doctrine-project.org/projects/doctrine-orm/zh/2.6/reference/advanced-configuration.html#reference-proxies 这将建立一个简单的代理服务器,以按ID使用实体,而不是实例化“ 5”或使用“ 6”从数据库中显式获取实体,然后可以通过刷新来更新实体。
$data = $entityManager->getReference(\'ATest\',$id);
$data->setName(\'ORM Tested\');
$entityManager->flush();
这对于更新实体的“ 8”或“ 9”关联特别有用。 EG:
$case->addTest($data);
手动设置新实体的标识符通常是一种不好的做法,即使目的是要更新实体。相反,通常最好让EntityManager或Entity构造函数建立适当的标识符,例如ѭ11。因此,Doctrine默认情况下将生成带有标识符的实体,该标识符为不带setter方法的私有属性。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...