Pjeroo
@Pjeroo
Веб-разработчик

Почему doctrine не может проставить правильный id при создании записи в базу в postgresql?

Доброго времени суток.

Есть две сущности и есть связь один к одному. Это users и user_info. Связал их вот так:
/**
 * Users
 *
 * @ORM\Table(name="users")
 * @ORM\Entity
 * @UniqueEntity("email")
 */
class User implements UserInterface
{
    /**
     * @var integer
     * @ORM\Id
     * @ORM\Column(nullable=false)
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

// ...
/**
     * @ORM\OneToOne(targetEntity="AppBundle\Entity\UserInfo", mappedBy="user", cascade={"persist"})
     */
    protected $information;


/**
 * UserInfo
 *
 * @ORM\Table(name="user_info")
 * @ORM\Entity
 */
class UserInfo
{
    /**
     * @var integer
     * @ORM\Id
     * @ORM\Column(nullable=false)
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="AppBundle\Entity\User", inversedBy="userInfo")
     * @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=false)
     */
    protected $user;


Добавляю данные так:
$user = $form->getData();
            $user->setCreated(date('Y-m-d H:i:s'));

            $user->getInformation()->setBalance(0);
            $user->getInformation()->setRevShare(0);
            $user->getInformation()->setMessengerType('skype');

            $encoder = $this->container->get('security.password_encoder');
            $encoded = $encoder->encodePassword($user, $user->getPassword());

            $user->setPassword($encoded);
            $em = $this->getDoctrine()->getManager();

            $em->persist($user);
            $em->flush();


Суть в том, что у основной сущности (Users) id проставляется, а у User_info id устанавливает в null и PG отказывается такой запрос выполнять, дескать, id не может быть null , хотя, судя по профилировщику symfony, доктрина выполняет оба запроса:
SELECT NEXTVAL('users_id_seq');
SELECT NEXTVAL('user_info_id_seq');


В чем может быть дело?
  • Вопрос задан
  • 1009 просмотров
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
читаем про каскадный persist. И да, я бы на вашем месте попробовал бы развернуть связь. А еще лучше - апнитесь до Doctrine 2.5 и вместо one-to-one используйте embeddable.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы