2013-10-14 48 views
0

我有一個用戶對象,我試圖通過Doctrine插入。爲@ID字段插入null的學說

的關鍵領域是

/** 
* @ORM\Column(type="integer", name="id") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $userId; 
/** 
* @ORM\Id 
* @ORM\Column(type="string", name="login_name") 
*/ 
private $loginName; 
/** 
* @ORM\Column(type="string", name="display_name") 
*/ 
private $name; 

以我控制器代碼我可以通過在物體上的getLoginName()方法回聲出$ LOGINNAME字段的值。

/** 
* @param mixed $loginName 
*/ 
public function setLoginName($loginName) 
{ 
    $this->loginName = $loginName; 
} 

/** 
* @return mixed 
*/ 
public function getLoginName() 
{ 
    return $this->loginName; 
} 

您可以看到Controller代碼在此處執行插入操作。

if ($request->getMethod() == 'POST') { 
     $form->bind($request); 
     $login = $form->getData(); 

     $factory = $this->get('security.encoder_factory'); 
     echo($login->getLoginName()); 
     $encoder = $factory->getEncoder($login); 
     $login->setPassword($encoder->encodePassword($login->getPassword(), $login->getSalt())); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($login); 
     $em->flush(); 

     $this->get('session')->setFlash(
      'success', 
      'Account Successfully Created' 
     ); 

但是,當我調用堅持和刷新我的實體時,登錄名字段正在''放入它(空白空間)。我無法理解爲什麼價值被取消(我將數據庫設置更改爲錯誤,因爲它是非唯一的)。

有這種類的關聯,但這是主要的,所以我首先創建它。

任何想法?

+1

爲什麼你不註釋$ userId作爲@Id? –

+0

因爲這是從Mysql Table自動生成的ID。在symfony中使用內置的auth框架,似乎我不得不使用登錄憑證作爲ID。但是這與爲什麼它有一個有值的ID字段並且它插入了空值並不相關 – jesmith17

+0

這不是真的。看看FOSUSerbundle,用戶也有一個ID字段,其中一個是@ID。 – m0c

回答

1

我不明白你在做什麼。你想table.id是一個自動生成的ID,但你想table.login_name成爲主鍵?因爲這是你如何把它設置

我個人認爲你應該想的是爲table.id是主鍵,併爲table.login_name是唯一

/** 
* @ORM\Column(type="integer", name="id") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $userId; 

/** 
* @ORM\Column(type="string", name="login_name", length=255, unique=true) 
*/ 
private $loginName; 
0

因此,在測試中,我發現您無法將generatedValue屬性應用於非ID字段。一旦我從userID字段中刪除它(並且允許Mysql自己處理它),事情又開始發揮作用。