2016-02-16 6 views
0

У меня есть объект Branch, который имеет объект Address, один адрес может быть ссылкой на многие другие типы объектов, что я хочу сделать, это когда я редактирую адрес в филиале вместо того, чтобы редактировать адрес с новыми данными, я хочу создать новый объект Address и привязать его к ветви, то, что происходит прямо сейчас, заключается в том, что редактирование адреса, проблема в том, что у меня есть другие объекты, связанные с этим адрес.При обновлении не обновляйте сущность, замените его

Это моя форма:

class MBBranchType extends AbstractType{ 

    protected $em; 

    function __construct(EntityManager $em){ 
     $this->em = $em; 
    } 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
     ->add('branchName') 
     ->add('branchCode') 
     ->add('destiny', 'entity', array(
      'class' => 'ATRBundle:Destiny', 
      'empty_value' => '-- Seleccione --', 
      'mapped' => true, 
      'query_builder' => function(EntityRepository $er){ 
        return $er->createQueryBuilder('d') 
         ->orderBy('d.destinyDesc', 'ASC'); 
     })) 
     ->add('startOperation', 'text') 
     ->add('stopOperation', 'text', array('required' => '')) 
     ->add('authorizationL1', 'checkbox', array('required' => '')) 
     ->add('authorizationL2', 'checkbox', array('required' => '')) 
     ->add('authorizationL3', 'checkbox', array('required' => '')) 
     ->add('address', new AddressType($this->em, new Address()), array('required' => '')) 
     ->add('active', 'checkbox', array('required' => '')); 

    $builder->get('startOperation')->addModelTransformer(new StringToDateTransformer()); 
    $builder->get('stopOperation')->addModelTransformer(new StringToDateTransformer()); 

    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'MB2\ATRBundle\Entity\MBBranch' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'mb2_atr_mb_branch'; 
    } 
} 

Это мое действие

public function editMBBranchAction() 
{ 
    $id = $this->request->query->get('id'); 
    $entity = $this->em->getRepository('ATRBundle:MBBranch')->find($id); 
    $form = $this->createForm(new MBBranchType($this->getDoctrine()->getManager()), $entity); 

    $form->handleRequest($this->request); 

    if ($form->isValid()) { 

     if($entity instanceof MBBranch){ 

      $addressEntity = $this->em->getRepository('ATRBundle:Address')->findOneBy(

       array('street'=>(string)$entity->getAddress()->getStreet() 
         , 'exteriorNum' => $entity->getAddress()->getExteriorNum(); 
         , 'interiorNum' => $entity->getAddress()->getInteriorNum(); 
         , 'settlment' => $entity->getAddress()->getSettlment() 
       ) 
      ); 

      if($addressEntity instanceof \MB2\ATRBundle\Entity\Address){ 
       $entity->setAddress($addressEntity); 
      }else{ 

       $otherAddress = new Address(); 

       $otherAddress->setStreet($entity->getAddress()->getStreet()); 
       $otherAddress->setExteriorNum($entity->getAddress()->getExteriorNum()); 
       $otherAddress->setInteriorNum($entity->getAddress()->getInteriorNum()); 
       $otherAddress->setSettlment($entity->getAddress()->getSettlment()); 

       $entity->setAddress($otherAddress); 
      } 

      $this->em->flush(); 
     } 

     return $this->redirect($this->generateUrl('admin', array('action' => 'list', 'entity' => $this->entity['name']))); 
    } 

    return $this->render($this->entity['templates']['edit'], array(
     'form'   => $form->createView(), 
     'entity'  => $entity, 
    )); 
} 

Как вы можете видеть, что проверяет, является ли новый адрес объект существует, если она существует, она устанавливает его на $ entity-> setAddress ($ addressEntity) ;, Если он не существует, он создал новый адрес() и устанавливает значения. Это работает, он создал новый адрес и сохраняет его в таблице, но по какой-либо причине он также обновляет старый объект адреса.

+0

Я не совсем понимаю, чего вы хотите достичь. Можете ли вы опубликовать пример ожидаемого результата и что происходит сейчас? – Hakim

+0

Hi @Hakim Я меняю свое объяснение, надеюсь, это более понятно. – gastoncs

ответ

0

Я нашел решение

Я добавил $ this-> em-> открепление ($ entity-> GetAddress()); перед присоединением нового адреса см. пример.

public function editMBBranchAction() 
{ 
    $id = $this->request->query->get('id'); 
    $entity = $this->em->getRepository('ATRBundle:MBBranch')->find($id); 
    $form = $this->createForm(new MBBranchType($this->getDoctrine()->getManager()), $entity); 

    $form->handleRequest($this->request); 

    if ($form->isValid()) { 

     if($entity instanceof MBBranch){ 

      $this->em->detach($entity->getAddress()); 

      $addressEntity = $this->em->getRepository('ATRBundle:Address')->findOneBy(

       array('street'=>(string)$entity->getAddress()->getStreet() 
         , 'exteriorNum' => $entity->getAddress()->getExteriorNum(); 
         , 'interiorNum' => $entity->getAddress()->getInteriorNum(); 
         , 'settlment' => $entity->getAddress()->getSettlment() 
       ) 
      ); 

      if($addressEntity instanceof \MB2\ATRBundle\Entity\Address){ 
       $entity->setAddress($addressEntity); 
      }else{ 

       $otherAddress = new Address(); 

       $otherAddress->setStreet($entity->getAddress()->getStreet()); 
       $otherAddress->setExteriorNum($entity->getAddress()->getExteriorNum()); 
       $otherAddress->setInteriorNum($entity->getAddress()->getInteriorNum()); 
       $otherAddress->setSettlment($entity->getAddress()->getSettlment()); 

       $entity->setAddress($otherAddress); 
      } 

      $this->em->flush(); 
     } 

     return $this->redirect($this->generateUrl('admin', array('action' => 'list', 'entity' => $this->entity['name']))); 
    } 

    return $this->render($this->entity['templates']['edit'], array(
     'form'   => $form->createView(), 
     'entity'  => $entity, 
    )); 
}