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;
    }