2013-12-25 3 views
1

У меня есть два объекта: User и UserProfile. Первичным ключом пользовательского объекта является автоинкремент и имя intUserID. Объект UserProfile имеет тот же первичный ключ (но не автоинкремент) и связан с объектом User. Когда я пытаюсь вставить все пользовательские данные в этих сущности, доктрина бросает исключение: Entity типа проект \ UsersBundle \ Entity \ UserProfile не хватает назначенного идентификатор поля «intuserid»Symfony 2 Первичный ключ является отношением один к одному с родительской таблицей

YML отображения для UserEntity:

Project\UsersBundle\Entity\User: 
type: entity 
table: user 
fields: 
    intuserid: 
     id: true 
     type: integer 
     unsigned: true 
     nullable: false 
     column: intUserID 
     generator: 
      strategy: IDENTITY 
    varname: 
     type: string 
     length: 150 
     fixed: false 
     nullable: false 
     column: varName 
    varemail: 
     type: string 
     length: 150 
     fixed: false 
     nullable: false 
     column: varEmail 
    varpassword: 
     type: string 
     length: 40 
     fixed: false 
     nullable: false 
     column: varPassword 

oneToOne: 
    profile: 
     targetEntity: Project\UsersBundle\Entity\UserProfile 
     cascade: ["all"] 
     joinColumn: 
      name: intuserid 
      referencedColumnName: intUserID 

lifecycleCallbacks: { } 

YML форма UserProfile:

Project\UsersBundle\Entity\UserProfile: 
type: entity 
table: user_profile 
fields: 
    intuserid: 
     id: true 
     type: integer 
     unsigned: true 
     nullable: false 
     column: intUserID 
    varsurname: 
     type: string 
     length: 50 
     fixed: false 
     nullable: true 
     column: varSurname 
    varpatronymic: 
     type: string 
     length: 50 
     fixed: false 
     nullable: true 
     column: varPatronymic 

oneToOne: 
    user: 
     targetEntity: Project\UsersBundle\Entity\User 
     inversedBy: profile 
     joinColumn: 
      name: intuserid 
      referencedColumnName: intUserID 

lifecycleCallbacks: { } 

CreateAction:

public function createAction(Request $request) 
{ 
    $user = new User(); 

    $form = $this->createCreateForm($user); 
    $form->handleRequest($request); 

    if ($form->isValid()) 
    { 
     $user->setVarSalt(md5(microtime().$user->getVarEmail())); 

     if ($user->getVarPassword()) 
     { 
      $encoder = $this->container->get('security.encoder_factory')->getEncoder($user); 
      $password = $encoder->encodePassword($user->getPassword(), $user->getSalt()); 
      $user->setVarPassword($password); 
     } 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($user); 
     $em->flush(); 

     $this->get('session')->getFlashBag()->add('success', 'Successfully saved'); 

     return $this->redirect($this->generateUrl('users_edit', array('id' => $user->getIntUserID()))); 
    } 

    return $this->render('ProjectUsersBundle:Default:edit.html.twig', array(
     'entity' => $user, 
     'form' => $form->createView(), 
    )); 
} 

Форма Пользователь

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('varname', 'text', array('label' => 'Название', 'required' => true)) 
     ->add('varemail', 'text', array('label' => 'E-mail', 'required' => true)) 
     ->add('varpassword', 'password', array('label' => 'Пароль')) 
     ->add('isactive', 'checkbox', array('label' => 'Активен')) 
     ->add('ispublic', 'checkbox', array('label' => 'Публичный профиль')) 
     ->add('profile', new UsersProfileType()) 
     ->add('save', 'submit', array('label' => 'Сохранить')); 
} 

Форма UserProfile

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('varsurname', 'text', array('label' => 'Фамилия')) 
     ->add('varpatronymic', 'text', array('label' => 'Отчество')) 
     ->add('save', 'submit', array('label' => 'Сохранить')); 
} 
+0

Трудно точно узнать, что здесь происходит без вашей формы, но кажется, что вы не устанавливаете поле intuserid в свой UserProfile. Если это неясно, возможно, разместите свою форму, чтобы мы могли помочь вам больше. – mattexx

+0

Я добавляю форму –

ответ

1

Вы объявили поле intuserid дважды в вашем UserProfile сущности. Удалить первое объявление:

# remove this part 
oneToOne: 
user: 
    targetEntity: Project\UsersBundle\Entity\User 
    inversedBy: profile 
    joinColumn: 
     name: intuserid 
     referencedColumnName: intUserID 

Вы также, возможно, потребуется удалить UserProfile перед тем сохраняющиеся User.

// set the UserProfile to null (assumes null default value to setUserProfile) 
$profile = $user->getUserProfile(); 
$user->setUserProfile(); 
$em = $this->getDoctrine()->getManager(); 
$em->persist($user); 
$em->flush(); 
$profile->setIntuserid($user->getIntuserid()); 
$em->persist($profile); 
$em->flush(); 

Дайте попробовать и посмотрите, не разблокирует ли он вас. Счастливого Рождества!

+0

Когда я удаляю объявление intuserid - ошибка сброса доктрины: MappingException: идентификатор/первичный ключ для объекта Entity «Project \ UsersBundle \ Entity \ UserProfile» не указан. Каждый объект должен иметь идентификатор/первичный ключ. –

+0

обновил мой ответ, чтобы установить поле пользовательского профиля intuserid – mattexx

+0

Спасибо за решение. Он работает после удаления пользователя из раздела oneToOne. Я отредактировал ваш ответ –