我嘗試爲產品目錄創建樹結構。 一個目錄可以有多個級別,並且級別可以包含多個產品。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上工作得很好)。
感謝您的幫助!
感謝您的答覆,但因爲我創造我的樹與jQuery和我修復表單數據IDS提交後,我不使用CatalogLevel自動增量ID。例如,關卡ID是這樣的:item-1,item-2,item-xx。 保存在數據庫中效果很好。我的「catalogue_niveau」表中包含所有關卡數據。此外,我的錯誤發生在AbstractProxyFactory類上,而不是直接在Entity CatalogLevel上。 – Felurian
好的,所以我不知道可能是什麼原因造成的,但是有一種更簡單的方法。你可以使用[doctrine tree extension](https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/tree.md#including-extension)。一張桌子上的所有魔法。 – ciurciurek
我不知道,謝謝!我會看看它是否與我的結構相符。 – Felurian