gpt4 book ai didi

symfony - 在级联中持久化 FOSUser 实体的好方法

转载 作者:行者123 更新时间:2023-12-04 06:08:58 25 4
gpt4 key购买 nike

我想保留一个用户实体扩展 FOSUserBundle 实体但发生错误:

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

如何重载我的用户实体的持久功能以提供所需的信息?

我的用户实体:
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 属性吗?

实际上,在我的 Controller 中发送表格后,我就有了:
$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();

...
}
}

你的意思是我必须在 persist 之后手动设置 usernameCanonical 属性吗?或者在哪里/何时?但特别是如何?

最佳答案

当您创建 Structure 的实例时然后尝试坚持/刷新... Doctrine2 是:

  • 意识到 Structure 上存在关系与 User (每个 Stucture 实例必须有一个 User 实例)
  • 因为没有User明确绑定(bind)到 Structure例如,它试图创建一个空的。
  • User 上的保存操作失败,因为没有数据(在这种情况下,usernameCanonical 字符串为空)

  • 你必须做的是...

    在您保存 Structure 之前, 添加 User 的实例到它...如果你想使用当前用户然后使用这个
    $user = $this->get('security.context')->getToken()->getUser();
    $structure->setMaster($user);
    $em->persist($structure);
    $em->flush();

    请记住包含 User Controller 类中的实体(使用 use 语句)。

    关于symfony - 在级联中持久化 FOSUser 实体的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8009406/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com