Хороший способ сохранить сущность 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 ответ:
Когда вы создаете экземпляр
Structure
и затем пытаетесь сохранить / смыть... Использует Doctrine2-это:
- понимая, что существует связь на
Structure
сUser
(каждый экземплярStucture
должен иметь экземплярUser
)- поскольку нет
User
явно привязанного к экземпляруStructure
, он пытается создать пустой экземпляр.- операция сохранения на
User
завершается неудачей, так как отсутствуют данные (в этом случае usernamecanonic строка пуста)Что вы должны сделай это...
Перед сохранением
Structure
добавьте к нему экземплярUser
... если вы хотите использовать текущего пользователя, то используйте этот$user = $this->get('security.context')->getToken()->getUser(); $structure->setMaster($user); $em->persist($structure); $em->flush();
Не забудьте включить сущность
User
в класс контроллера (с помощью оператораuse
).