2016-02-04 7 views
1

У меня есть отношение OneToOne в Symfony между пользователем и учеником, где пользователь является владельцем, когда я пытаюсь сохранить изменения, не производится ни в одной из сторон, это моя последняя конфигурация :Объекты OneToOne не будут сохраняться с Doctrine в Symfony2

<?php 

/** 
* User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity(repositoryClass="BackendBundle\Repository\UserRepository") 
*/ 
class User implements UserInterface, \Serializable 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToOne(targetEntity="Student", mappedBy="user") 
    */ 
    private $student; 

    public function __construct() { 
    } 


    /** 
    * Set student 
    * 
    * @param \BackendBundle\Entity\Student $student 
    * 
    * @return User 
    */ 
    public function setStudent(\BackendBundle\Entity\Student $student) 
    { 
     $this->student = $student; 

     return $this; 
    } 

    /** 
    * Get student 
    * 
    * @return \BackendBundle\Entity\Student 
    */ 
    public function getStudent() 
    { 
     return $this->student; 
    } 

} 

студент:

<?php 

/** 
* Student 
* 
* @ORM\Table(name="Student") 
* @ORM\Entity(repositoryClass="BackendBundle\Repository\StudentRepository") 
*/ 
class Student 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToOne(targetEntity="User", inversedBy="student") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $user; 

    public function __construct() { 

    } 
} 

и в контроллере:

public function editAction(Request $request, User $user) 
{ 
    $student = new Student(); 
    $user->setStudent($student); 

    $em = $this->getDoctrine()->getManager(); 
    $em->persist($student); 
    $user->setStudent($student); 
    $em->persist($user); 
    $em->flush(); 
    /.../ 
} 

Я могу сохранить оба сущности и изменения без каких-либо исключений, но я не могу их связать, например, при просмотре, когда я делаю {{ user.student }}, он дает мне значение null, а {{ student.user_id }} также равно null.

ответ

4

Измените код следующим образом

<?php 

/** 
* User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity(repositoryClass="BackendBundle\Repository\UserRepository") 
*/ 
class User implements UserInterface, \Serializable 
{ 
    /** 
    * @ORM\OneToOne(targetEntity="Student", mappedBy="user", cascade={"persist"}) 
    */ 
    private $student; 

    // ... 

    /** 
    * Set student 
    * 
    * @param \BackendBundle\Entity\Student $student 
    * 
    * @return User 
    */ 
    public function setStudent(\BackendBundle\Entity\Student $student) 
    { 
     $this->student = $student; 
     $student->setUser($this); 

     return $this; 
    } 

    // ... 
} 

public function editAction(Request $request, User $user) 
{ 
    $student = new Student(); 
    $user->setStudent($student); 

    $em->flush(); 
} 

Почему это править?

Потому что доктрина «слушает» только для изменений на стороне владельца (так что Student объект). Если вы хотите, чтобы сохраняться пользователем без головной боли для студента, вам необходимо:

1 - Установить пользователь в студент (владеющая сторона) при установке студента в пользователь
2 - Использование каскадное сохраняется на студенческой собственности пользователя

PS: Если вы извлекаете пользователя (более вообще сущность) из db с доктриной (даже с преобразователем параметров), вам не нужно явно указывать persist на этот объект.

+0

Мне нужно было создать метод setUser() в моем классе учеников и работать как шарм, спасибо! – ericksho

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

  • Нет связанных вопросов^_^