Хороший способ сохранить сущность FOSUser в каскаде - PullRequest
2 голосов
/ 04 ноября 2011

Я хочу сохранить объект User расширяет объект FOSUserBundle, но произошла ошибка:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'username_canonical' cannot be null

Как я могу перегрузить функцию сохранения моего объекта User для предоставления необходимой информации?

Мой пользователь:

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

     /**
      *
      * @ORM\OneToOne(targetEntity="MyApp\MainBundle\Entity\Project")
      */
     private $project;
...
}

Сущность моего проекта:

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

    /**
     * @var integer $master
     *
     * @ORM\OneToOne(targetEntity="Uriae\UserBundle\Entity\User", cascade={"persist"})
     *
     * @Assert\NotBlank()
     * @Assert\Type(type="Uriae\UserBundle\Entity\User")
     */
    private $master;
...
}

РЕДАКТИРОВАТЬ ДЛЯ ОТВЕТА FractalizeR:

Вы имеете в виду, что я должен вручную установить свойство usernameCanonical после сохранения?

На самом деле у меня есть это после отправки формы в моем контроллере:

$structure = new \Uriae\MainBundle\Entity\Structure();
if ($request->getMethod() == 'POST')
{
    $form->bindRequest($request);

    if ($form->isValid())
    {
       $em = $this->getDoctrine()->getEntityManager();
       $em->persist($structure);
       $em->flush();

       ...
    }
}

Вы имеете в виду, что я должен вручную установить свойство usernameCanonical после сохранения? Или где / когда? Но особенно как?

1 Ответ

3 голосов
/ 18 ноября 2011

Когда вы создаете экземпляр Structure, а затем пытаетесь сохранить / сбросить ... Doctrine2 - это:

  1. Понимание того, что существует связь на Structure с User(каждый экземпляр Stucture должен иметь экземпляр User)
  2. Поскольку User явно не привязан к экземпляру Structure, он пытается создать пустой.
  3. Операция сохранения на User завершается неудачно, потому что нет данных (в этом случае строка usernameCanonical пуста)

Что вы должны сделать, это ...

Перед вамисохраните Structure, добавьте к нему экземпляр User ... если вы хотите использовать текущего пользователя, тогда используйте этот

$user = $this->get('security.context')->getToken()->getUser();
$structure->setMaster($user);
$em->persist($structure);
$em->flush();

Не забудьте включить сущность User в ваш класс контроллера(с оператором use).

...