2016-06-13 46 views
1

我嘗試爲產品目錄創建樹結構。 一個目錄可以有多個級別,並且級別可以包含多個產品。Symfony3編輯實體:錯誤主鍵缺失值

我設法救我的結構,數據庫,但是當我想編輯它,我有這樣的錯誤:

Error : Missing value for primary key catalogCode on AppBundle\Entity\CatalogLevel 
at OutOfBoundsException ::missingPrimaryKeyValue ('AppBundle\Entity\CatalogLevel', 'catalogCode') 
in vendor\doctrine\common\lib\Doctrine\Common\Proxy\AbstractProxyFactory.php at line 125 

當我做這在我的CatalogController:

$form = $this->createForm(CatalogTreeType::class, $catalog); 

但是,只是在該行之前,我驗證我是否正確地獲得了自己的級別,看起來像是這樣:

// Create an ArrayCollection of the current levels 
$originalLevels = new ArrayCollection(); 
foreach ($catalog->getLevels() as $level) { 
    var_dump($level->getCatalogCode()); 
    $originalLevels->add($level); 
} 

// returns 
AppBundle\Controller\CatalogController.php:337:string 'TT-FTEST' (length=8) 

AppBundle\Controller\CatalogController.php:337:string 'TT-FTEST' (length=8) 

CatalogLevel實體具有一個組合鍵:levelId + catalogCode。

考慮到主鍵catalogCode不是空,我不明白這個錯誤...

目錄實體

/** 
* @ORM\Table(name="catalogue") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\CatalogRepository") 
* @UniqueEntity(fields="code", message="Catalog code already exists") 
*/ 
class Catalog 
{ 
    /** 
    * @ORM\Column(name="Catalogue_Code", type="string", length=15) 
    * @ORM\Id 
    * @Assert\NotBlank() 
    * @Assert\Length(max=15, maxMessage="The code is too long ({{ limit }} characters max)") 
    */ 
    private $code; 

    /** 
    * @ORM\OneToMany(targetEntity="CatalogLevel", mappedBy="catalog", cascade={"persist", "remove"}) 
    * @Assert\Valid 
    */ 
    private $levels; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->levels = new ArrayCollection(); 
    } 

    /** 
    * Get levels 
    * 
    * @return ArrayCollection 
    */ 
    public function getLevels() 
    { 
     return $this->levels; 
    } 

    /** 
    * Add level 
    * 
    * @param \AppBundle\Entity\CatalogLevel $level 
    * 
    * @return Catalog 
    */ 
    public function addLevel(\AppBundle\Entity\CatalogLevel $level) 
    { 
     $level->setCatalogCode($this->getCode()); 
     $level->setCatalog($this); 

     if (!$this->getLevels()->contains($level)) { 
      $this->levels->add($level); 
     } 

     return $this; 
    } 

    /** 
    * Remove level 
    * 
    * @param \AppBundle\Entity\CatalogLevel $level 
    */ 
    public function removeLevel(\AppBundle\Entity\CatalogLevel $level) 
    { 
     $this->levels->removeElement($level); 
    } 
} 

CatalogLevel實體

/** 
* @ORM\Table(name="catalogue_niveau") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\CatalogLevelRepository") 
*/ 
class CatalogLevel 
{ 
    /** 
    * @ORM\Column(name="Niveau_ID", type="string", length=15) 
    * @ORM\Id 
    */ 
    private $id; 

    /** 
    * @ORM\Column(name="Catalogue_Code", type="string", length=15) 
    * @ORM\Id 
    */ 
    private $catalogCode; 

    /** 
    * @ORM\ManyToOne(targetEntity="Catalog", inversedBy="levels") 
    * @ORM\JoinColumn(name="Catalogue_Code", referencedColumnName="Catalogue_Code") 
    */ 
    private $catalog; 

    /** 
    * Set id 
    * 
    * @param string $id 
    * 
    * @return CatalogLevel 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 

     return $this; 
    } 

    /** 
    * Get id 
    * 
    * @return string 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set catalogCode 
    * 
    * @param string $catalogCode 
    * 
    * @return CatalogLevel 
    */ 
    public function setCatalogCode($catalogCode) 
    { 
     $this->catalogCode = $catalogCode; 

     return $this; 
    } 

    /** 
    * Get catalogCode 
    * 
    * @return string 
    */ 
    public function getCatalogCode() 
    { 
     return $this->catalogCode; 
    } 
} 

我會喜歡e提醒你,當我顯示預先填充的表單時,editAction發生了這個錯誤(它在addAction上工作得很好)。

感謝您的幫助!

回答

0

我認爲這是因爲您在實體CatalogLevel中沒有自動增加id。嘗試將此代碼添加至此代碼:

@ORM\GeneratedValue(strategy="AUTO") 
+0

感謝您的答覆,但因爲我創造我的樹與jQuery和我修復表單數據IDS提交後,我不使用CatalogLevel自動增量ID。例如,關卡ID是這樣的:item-1,item-2,item-xx。 保存在數據庫中效果很好。我的「catalogue_niveau」表中包含所有關卡數據。此外,我的錯誤發生在AbstractProxyFactory類上,而不是直接在Entity CatalogLevel上。 – Felurian

+0

好的,所以我不知道可能是什麼原因造成的,但是有一種更簡單的方法。你可以使用[doctrine tree extension](https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/tree.md#including-extension)。一張桌子上的所有魔法。 – ciurciurek

+0

我不知道,謝謝!我會看看它是否與我的結構相符。 – Felurian

0

您在創建實體的方式上遇到了一些問題。您應該使用自動生成策略。此外,「@ORM \ Id」註釋是唯一標識符。

此外,您的「JoinColumn」不正確。您需要回顧「目錄」實體,它是id(標識符)。 CatalogLevel類中不需要2個「@ORM \ Id」條目。

所以進行這些更改:

/** 
* @ORM\Table(name="catalog") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\CatalogRepository") 
*/ 
class Catalog 
{ 
    /** 
    * @ORM\Column(name="cat_id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $cat_id; 

    /** 
    * @ORM\OneToMany(targetEntity="CatalogLevel", mappedBy="catalog", cascade={"persist", "remove"}) 
    * @Assert\Valid 
    */ 
    private $levels; 
    ... 


/** 
* @ORM\Table(name="catalog_level") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\CatalogLevelRepository") 
*/ 
class CatalogLevel 
{ 
    /** 
    * @ORM\Column(name="cat_level_id", type="integer") 
    * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $cat_level_id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Catalog", inversedBy="levels") 
    * @ORM\JoinColumn(name="local_cat_id", referencedColumnName="cat_id") 
    */ 
    private $catalog; 
    ... 
+0

感謝您的回覆,但我沒有爲Catalog和CatalogLevel使用自動增量ID。用戶可以輸入目錄的代碼,並將此代碼用作主鍵。 爲了具有唯一的級別標識符,我使用組合鍵與目錄代碼和級別ID,我在提交表單後(我在jquery中構建拖放樹並在js中生成ids)後獲得了該級別ID。 保存在數據庫中效果很好。我的「catalogue_niveau」表中包含所有關卡數據。此外,我的錯誤發生在AbstractProxyFactory類上,而不是直接在Entity CatalogLevel上。 – Felurian

+0

我在互聯網上找到了一種避免此錯誤的方法:刪除實體CatalogLevel中的$ catalogCode屬性的@ORM \ Id。 編輯窗體正在顯示,並預先填充了關卡數據。但我不認爲這是一個可行的解決方案... – Felurian