Symfony ManyToOne удаляет отношение без обновления дочернего объекта

У меня есть объект Serveur, у которого есть отношение ManyToOne с 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;

Когда вы вводите новый ответственный, в моем updateAction (serveur) я вызываю службу, которая проверяет, есть ли уже ответственный с этим uid, и если нет, я возвращаю новый ответственный:

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

Теперь, когда я редактирую server, если нет ответственного и я ввожу его, он работает независимо от того, существует ответственный или нет.

Но если я редактирую server, у которого уже есть ответственный, и я хочу установить для Responsable значение null, это не работает:

Произошло исключение при выполнении 'ОТВЕТСТВЕННОЕ ОБНОВЛЕНИЕ SET Uid = ? ГДЕ идентификатор = ?' с параметрами [null, 192]: SQLSTATE [23000]: нарушение ограничения целостности: 1062 Дублирующаяся запись '' для ключа 'UNIQ_52520D076BD640E6'

На самом деле он пытается ОБНОВИТЬ uid ответственного до нуля, но это не то, чего я хочу, я хотел бы сохранить ответственного в БД и просто удалить отношение.

Я что-то упускаю ?

Спасибо !


person SMB Punt    schedule 20.06.2018    source источник


Ответы (1)


Я использовал 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;
    }
person SMB Punt    schedule 26.06.2018