微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

原则2从实体更新

如何解决原则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方法的私有属性。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。