保持FOSUser实体级联的好方法

时间:2011-11-04 12:49:07

标签: symfony doctrine-orm fosuserbundle

我想坚持用户实体扩展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:

你的意思是我必须在persist之后手动设置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 个答案:

答案 0 :(得分:3)

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

  1. 意识到StructureUser之间存在关系(每个Stucture实例必须有User个实例)
  2. 因为没有User显式绑定到Structure实例,所以它会尝试创建一个空实例。
  3. User上的保存操作失败,因为没有数据(在这种情况下,usernameCanonical字符串为空)
  4. 你必须做的是......

    在保存Structure之前,请向其添加User的实例...如果您要使用当前用户,请使用此

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

    请记住在控制器类中包含User实体(使用use语句)。