Den*_*nis 43 php orm doctrine-orm
是否可以通过以下类似的方式更新实体:
$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();
Run Code Online (Sandbox Code Playgroud)
这将插入并更改对象的id,而不是更新数据库中的现有行.
Fra*_*ula 90
你应该调用merge而不是persist:
$data = new MyEntity();
$data->setId(123);
$data->setName('test');
$entityManager->merge($data);
$entityManager->flush();
Run Code Online (Sandbox Code Playgroud)
Den*_*nis 53
我不得不使用
$entityManager->merge($data)
Run Code Online (Sandbox Code Playgroud)
Ton*_*nov 13
或者只是获取被管实体而不是空实体.
$data = $entityManager->getRepository('ATest')->findOne(1); // ATest is my entitity class
$data->name = "ORM Tested"; // just change the name
$entityManager->persist($data);
$entityManager->flush();
Run Code Online (Sandbox Code Playgroud)
如果实体已经被管理,则persist()将更新它而不是插入新实体.
fyr*_*rye 12
您还可以使用getReference按标识符更新实体属性而不检索数据库状态.
这将建立一个简单的代理,通过ID与Entity一起工作,而不是使用实例化new Entity或显式从数据库获取实体find(),然后可以通过flush更新.
$data = $entityManager->getReference('ATest', $id);
$data->setName('ORM Tested');
$entityManager->flush();
Run Code Online (Sandbox Code Playgroud)
这对于更新实体OneToMany或ManyToMany协会特别有用.例如:$case->addTest($data);
即使意图更新实体,手动设置新实体的标识符通常也是不好的做法.相反,通常最好让EntityManager或Entity构造函数建立适当的标识符,例如a UUID.因此,Doctrine默认会生成实体,标识符为私有属性,没有setter方法.