Symfony ManyToOne无需更新子实体即可删除该关系

时间:2018-06-20 08:40:04

标签: php doctrine symfony-2.7

我有一个实体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(服务端)中,我会调用一个服务,该服务查看此uid是否已经有一个Responsable,否则,我将返回一个新的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);
        }

现在,当我编辑服务器时,如果没有负责人,而我输入了一个,则无论负责人是否存在,它都在工作。

但是,如果我编辑已经具有负责人的servur,并且要将setResponsable设置为null,则它不起作用:

  

执行'UPDATE负责的SET Uid =吗? id =?'带有参数[null,192]:SQLSTATE [23000]:违反完整性约束:1062键'UNIQ_52520D076BD640E6'的重复条目

它实际上是试图将负责人的uid更新为null,但这不是我想要的,我想将负责人的uid保留在数据库中,然后删除该关系。

我想念什么吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我使用了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;
    }