Хороший способ сохранить сущность FOSUser в каскаде


Я хочу сохранить пользовательскую сущность extends FOSUserBundle entity, но произошла ошибка:

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

Как я могу перегрузить функцию persist моей сущности пользователя, чтобы дать ей необходимую информацию ?

Моя сущность пользователя:

class User extends BaseUser
{
    /**
     * @var integer $id
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
     protected $id;

     /**
      *
      * @ORMOneToOne(targetEntity="MyAppMainBundleEntityProject")
      */
     private $project;
...
}

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

class Structure
{
    /**
     * @var integer $id
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $master
     *
     * @ORMOneToOne(targetEntity="UriaeUserBundleEntityUser", cascade={"persist"})
     *
     * @AssertNotBlank()
     * @AssertType(type="UriaeUserBundleEntityUser")
     */
    private $master;
...
}

Изменить в ответ FractalizeR :

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

Фактически у меня есть это после того, как форма отправлена в мой контроллер :

$structure = new UriaeMainBundleEntityStructure();
if ($request->getMethod() == 'POST')
{
    $form->bindRequest($request);

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

       ...
    }
}

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

1 2

1 ответ:

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

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

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

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

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

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