2016-03-09 4 views
2

Мне нужна помощь с Symfony2 форма От одного до одного отношение обновление. У меня есть к объектам: Пользователь и UserInfoSymfony2 форма обновление один-к-одному отношение

объект пользователя:

class User extends BaseUser 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Group") 
    * @ORM\JoinTable(name="fos_user_user_group", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $groups; 

    /** 
    * @ORM\OneToOne(targetEntity="UserInfo", mappedBy="user", cascade={"all"}) 
    */ 
    private $info; 

    /** 
    * @ORM\OneToMany(targetEntity="Log", mappedBy="user") 
    */ 
    private $logs; 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->logs = new ArrayCollection(); 
    } 

    /** 
    * Set info 
    * 
    * @param \AppBundle\Entity\UserInfo $info 
    * @return User 
    */ 
    public function setInfo(\AppBundle\Entity\UserInfo $info = null) 
    { 
     $this->info = $info; 
     $info->setUser($this); 

     return $this; 
    } 

    /** 
    * Get info 
    * 
    * @return \AppBundle\Entity\UserInfo 
    */ 
    public function getInfo() 
    { 
     return $this->info; 
    } 

    /** 
    * Add logs 
    * 
    * @param \AppBundle\Entity\Log $logs 
    * @return User 
    */ 
    public function addLog(\AppBundle\Entity\Log $logs) 
    { 
     $this->logs[] = $logs; 

     return $this; 
    } 

    /** 
    * Remove logs 
    * 
    * @param \AppBundle\Entity\Log $logs 
    */ 
    public function removeLog(\AppBundle\Entity\Log $logs) 
    { 
     $this->logs->removeElement($logs); 
    } 

    /** 
    * Get logs 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getLogs() 
    { 
     return $this->logs; 
    } 
} 

UserInfo лицо:

class UserInfo 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="position", type="string", length=255) 
    */ 
    private $position; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="info", type="text") 
    */ 
    private $info; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="fullname", type="string", length=255) 
    */ 
    private $fullname; 

    /** 
    * @ORM\OneToOne(targetEntity="User", inversedBy="info") 
    */ 
    private $user; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set position 
    * 
    * @param string $position 
    * @return UserInfo 
    */ 
    public function setPosition($position) 
    { 
     $this->position = $position; 

     return $this; 
    } 

    /** 
    * Get position 
    * 
    * @return string 
    */ 
    public function getPosition() 
    { 
     return $this->position; 
    } 

    /** 
    * Set info 
    * 
    * @param string $info 
    * @return UserInfo 
    */ 
    public function setInfo($info) 
    { 
     $this->info = $info; 

     return $this; 
    } 

    /** 
    * Get info 
    * 
    * @return string 
    */ 
    public function getInfo() 
    { 
     return $this->info; 
    } 

    /** 
    * Set fullname 
    * 
    * @param string $fullname 
    * @return UserInfo 
    */ 
    public function setFullname($fullname) 
    { 
     $this->fullname = $fullname; 

     return $this; 
    } 

    /** 
    * Get fullname 
    * 
    * @return string 
    */ 
    public function getFullname() 
    { 
     return $this->fullname; 
    } 

    /** 
    * Set user 
    * 
    * @param \AppBundle\Entity\User $user 
    * @return UserInfo 
    */ 
    public function setUser(\AppBundle\Entity\User $user = null) 
    { 
     $this->user = $user; 

     return $this; 
    } 

    /** 
    * Get user 
    * 
    * @return \AppBundle\Entity\User 
    */ 
    public function getUser() 
    { 
     return $this->user; 
    } 
} 

Это их типы:

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('username') 
      ->add('email') 
      ->add('password') 
      ->add('info', new UserInfoType(), [ 
       'by_reference' => false, 
      ]) 
      ->add('Submit', 'submit') 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'AppBundle\Entity\User', 
     ]); 
    } 

    public function getName() 
    { 
     return 'user'; 
    } 
} 

и

class UserInfoType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('position') 
      ->add('info') 
      ->add('fullname') 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'AppBundle\Entity\UserInfo', 
      'allow_delete' => true, 
     ]); 
    } 

    public function getName() 
    { 
     return 'userinfo'; 
    } 
} 

Новые записи вставки без каких-либо проблем, но когда я хочу, чтобы обновить эту запись с этим действием:

public function editAction(Request $request, $id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $userRepository = $em->getRepository('AppBundle:User'); 

    $user = $userRepository->findOneBy(['id' => $id]); 

    $form = $this->createForm(new UserType(), $user); 

    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $em->persist($user); 
     $em->flush(); 

     return $this->redirectToRoute('user_list'); 
    } 

    return $this->render('@App/User/form.html.twig', [ 
     'form' => $form->createView(), 
    ]); 
} 

Я получаю эту ошибку:

An exception occurred while executing 'INSERT INTO user_info (position, info, fullname, user_id) VALUES (?, ?, ?, ?)' with params ["321", "321", "321", 14]: 

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '14' for key 'UNIQ_B1087D9EA76ED395' 

Ок, я понимаю, что он хочет, чтобы вставить но я должен сделать, чтобы он ОБНОВЛЯЛ его или УДАЛИТЬ существующий и INSERT новый.

+0

Как насчет добавления 'fetch =" EAGER "' '' '' '' '' '' '' '' '' 'info' '' '' '' 'пользователя? –

+0

@ PawełMikołajczuk Nop, все тот же. – Justinas

ответ

3

Попробуйте сделать User стороне владеющее и UserInfo обратный один (см docs).

class User extends BaseUser 
{ 
    /** 
    * @ORM\OneToOne(targetEntity="UserInfo", inversedBy="user", cascade={"all"}) 
    */ 
    private $info; 
} 

class UserInfo 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

/** 
    * @ORM\OneToOne(targetEntity="User", mappedBy="info") 
    */ 
    private $user; 
} 

также связан с this SO question.

Edit: Чтобы удалить старые, неиспользуемые UserInfo записи после обновления, установите orphanRemoval параметр в info свойстве User класса.

class User extends BaseUser 
{ 
    /** 
    * @ORM\OneToOne(targetEntity="UserInfo", inversedBy="user", cascade={"all"}, orphanRemoval=true) 
    */ 
    private $info; 
} 
+0

Теперь она вставляет информацию в таблицу 'UserInfo' и обновляет столбец' info_id' в таблице 'User'. Старые записи просто висят в таблице. Как удалить старые записи? – Justinas

+0

Попробуйте комментарий Pawel и добавьте 'fetch =" EAGER "' в свойство 'info' в классе' User'. –

+0

Ещё не удалял – Justinas

0

Вы должны использовать JoinColumn аннотаций в вашем User классе:

/** 
* @ORM\OneToOne(targetEntity="UserInfo", inversedBy="user", cascade={"all"}) 
* @ORM\JoinColumn(name="info", referencedColumnName="id") 
*/ 
private $info; 

USERINFO:

/** 
* @ORM\OneToOne(targetEntity="User", mappedBy="info") 
*/ 
private $user; 
+0

Еще одна ошибка – Justinas

Смежные вопросы