学说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,而不是更新数据库中的现有行。

你应该调用合并而不是坚持:

 $data = new MyEntity(); $data->setId(123); $data->setName('test'); $entityManager->merge($data); $entityManager->flush(); 

我不得不使用

 $entityManager->merge($data) 

或者只是得到托pipe实体,而不是一个空的。

 $data = $entityManager->getRepository('ATest')->findOne(1); // ATest is my entitity class $data->name = "ORM Tested"; // just change the name $entityManager->persist($data); $entityManager->flush(); 

如果实体已经被pipe理,persist()会更新它,而不是插入一个新的。

您还可以使用getReference通过标识符更新实体属性,而不检索数据库状态。

http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html#reference-proxies

这将build立一个简单的代理服务器,通过ID与实体一起工作,而不是实例化一个new Entity或者使用find()从数据库中显式获取实体,然后可以通过flush来更新实体。

 $data = $entityManager->getReference('ATest', $id); $data->setName('ORM Tested'); $entityManager->flush(); 

这对于更新实体的OneToManyManyToMany关联特别有用。 EG: $case->addTest($data);

即使意图更新实体,手动设置新实体的标识符通常也是不好的做法。 相反,通常最好让EntityManagerbuild立适当的标识符。 出于这个原因,默认情况下Doctrine生成的实体的标识符是一个私有财产,没有setter方法。