2

我想保留一个用户实体扩展 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 属性吗?

实际上,在我的控制器中发送表格后,我就有了:

$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 属性吗?或者在哪里/何时?但特别是如何?

4

1 回答 1

3

当您创建一个实例Structure然后尝试持久化/刷新...时,Doctrine2 是:

  1. 意识到StructureUser(每个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语句)。

于 2011-11-18T13:23:48.483 回答