2011-11-04 95 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聲明)。