2011-11-04 111 views
2

一个FOSUser实体我想坚持用户实体的很好的方式延伸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财产坚持手动设置?

Actyally我有后的形式在我的控制器发送:

$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财产的坚持?或在哪里/何时?但特别如何?

+0

您是否在持续用户之前设置了usernameCanonical属性? –

+0

@FractalizeR实际上,FOSUser实体有很多属性不能为null,并且通过这种方式持久化,FOSUser不能将属性设置为良好的值。 我找到一种方法来设置这个值,而不需要手动设置这些值并使用FOSUser函数。 – Naelyth

回答

3

当你创建的Structure一个实例,然后试图坚持/平... Doctrine2是:

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

你必须做什么是...

保存Structure之前,的User一个实例添加到它...如果你想使用当前用户再使用这个

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

请注意,在您的对照实体User oller类(与use声明)。