更新原则2中的关联实体


Updating associated entity in Doctrine2

我有一个用户实体类,有一个关联的 SpecificData enity 类。通过表单,我想更新该特定数据,因此,如果我尝试从会话中获取用户:

$user = $this->getRequest()->getSession()->get('user');
$userRepository = $this->getDoctrine()->getRepository('eCommerceUserBundle:User');
$user->setParticularData($data); // $data is a ParticularData instance fetched from the form 
$userRepository->update($user);

数据库没有任何变化(尽管对于SpecificData已更改的系统)。然后我尝试直接从数据库中获取用户:

$userRepository = $this->getDoctrine()->getRepository('eCommerceUserBundle:User');
$user = $userRepository->selectById(20);
$user->setParticularData($data);
$userRepository->update($user);

在这种情况下,Doctrine2 将该新 SpecificData 视为新实例,因此它尝试在 SpecificData 关联表中插入另一行(而不是更新现有行)。

我的更新方法:

public function update($user){
    $this->_em->merge($user);
    $this->_em->flush();
}

那么,我怎样才能更新一个关联的实体,轻松地告诉 Doctrine2 更新,而不是插入?

只需更新实体并调用 $em->flush() 即可

如果要在会话中存储实体,则需要合并它以告诉ORM必须管理该实体:

$user = $session->get('user');
$user = $em->merge($user);

我找到的解决方案是在我的SpecificData中执行此操作:

/**
* Converts one ParticularData in THIS ParticularData, in order to tell Doctrine2 that the    new ParticularData is the same as before; but with new fields.
* @param ParticularData $data
*/
public function cloneData($data){
    $this->setAddress($data->getAddress());
    $this->setCity($data->getCity());
    $this->setCountry($data->getCountry());
    $this->setName($data->getName());
    $this->setNIN($data->getNIN());
    $this->setPhone($data->getPhone());
    $this->setPostalCode($data->getPostalCode());
    $this->setProvince($data->getProvince());
    $this->setSurname($data->getSurname());