Symfony ManyToOne 删除关系而不更新子实体
Symfony ManyToOne remove the relation without updating the child entity
我有一个实体 Serveur
,它与 Responsable
有 ManyToOne 关系
class Serveur implements NotifyPropertyChanged
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \MyBundle\Entity\Responsable
*
* @ORM\ManyToOne(targetEntity="\MyBundle\Entity\Responsable", inversedBy="serveurs", cascade={"persist"})
* @ORM\JoinColumn(name="serveur_responsable", referencedColumnName="id", nullable=true)
*
*/
private $responsable;
class Responsable
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="Uid", type="string", unique=true, nullable=false)
*/
private $uid;
当你输入一个新的 Responsable 时,在我的 updateAction (serveur) 中,我会调用一个服务来查看是否已经有一个具有此 uid 的 Responsable,如果没有,我 return 一个新的 Responsable :
public function updateAction(Request $request, $id)
{
$entity = $em->getRepository('MyBundle:Serveur')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Serveur entity.');
}
$editForm = $this->createEditForm($entity);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$resp = $editForm['responsable']->getData();
if($resp->getUid()){
$entity_resp = $this->container->get('app.responsable')->getResp($resp->getUid());
$entity->setResponsable($entity_resp);
}
else{
$entity->setResponsable(null);
}
现在,当我编辑服务器时,如果没有负责人而我输入了一个,无论负责人是否存在,它都会工作。
但是如果我编辑一个已经有一个负责人的服务器,并且我想将 setResponsable 设置为 null,它就不起作用:
An exception occurred while executing 'UPDATE responsable SET Uid = ? WHERE id = ?' with params [null, 192]: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'UNIQ_52520D076BD640E6'
它实际上是在尝试将负责人的 uid 更新为 null,但这不是我想要的,我想将负责人保留在数据库中并删除关系..
我是不是漏掉了什么?
谢谢!
我使用了 DataTransformer:
class RespTransformer implements DataTransformerInterface{
private $om;
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
public function transform($resp)
{
if(null === $resp){
return '';
}
return $resp->getUid();
}
public function reverseTransform($uid)
{
if(!$uid){
return;
}
$resp = $this->om
->getRepository('MyBundle:Responsable')
->findOneByUid($uid);
if(null === $resp){
$resp = new Responsable();
$resp->setUid($uid);
}
return $resp;
}
我有一个实体 Serveur
,它与 Responsable
class Serveur implements NotifyPropertyChanged
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \MyBundle\Entity\Responsable
*
* @ORM\ManyToOne(targetEntity="\MyBundle\Entity\Responsable", inversedBy="serveurs", cascade={"persist"})
* @ORM\JoinColumn(name="serveur_responsable", referencedColumnName="id", nullable=true)
*
*/
private $responsable;
class Responsable
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="Uid", type="string", unique=true, nullable=false)
*/
private $uid;
当你输入一个新的 Responsable 时,在我的 updateAction (serveur) 中,我会调用一个服务来查看是否已经有一个具有此 uid 的 Responsable,如果没有,我 return 一个新的 Responsable :
public function updateAction(Request $request, $id)
{
$entity = $em->getRepository('MyBundle:Serveur')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Serveur entity.');
}
$editForm = $this->createEditForm($entity);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$resp = $editForm['responsable']->getData();
if($resp->getUid()){
$entity_resp = $this->container->get('app.responsable')->getResp($resp->getUid());
$entity->setResponsable($entity_resp);
}
else{
$entity->setResponsable(null);
}
现在,当我编辑服务器时,如果没有负责人而我输入了一个,无论负责人是否存在,它都会工作。
但是如果我编辑一个已经有一个负责人的服务器,并且我想将 setResponsable 设置为 null,它就不起作用:
An exception occurred while executing 'UPDATE responsable SET Uid = ? WHERE id = ?' with params [null, 192]: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'UNIQ_52520D076BD640E6'
它实际上是在尝试将负责人的 uid 更新为 null,但这不是我想要的,我想将负责人保留在数据库中并删除关系..
我是不是漏掉了什么?
谢谢!
我使用了 DataTransformer:
class RespTransformer implements DataTransformerInterface{
private $om;
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
public function transform($resp)
{
if(null === $resp){
return '';
}
return $resp->getUid();
}
public function reverseTransform($uid)
{
if(!$uid){
return;
}
$resp = $this->om
->getRepository('MyBundle:Responsable')
->findOneByUid($uid);
if(null === $resp){
$resp = new Responsable();
$resp->setUid($uid);
}
return $resp;
}