我尝试为产品目录创建树结构。 目录可以包含多个级别,级别可以包含多个产品。
我设法将我的结构保存在数据库中但是当我想编辑它时,我有这个错误:
$processedArray = array();
$finalOutput = array();
foreach($elements as $elem){
if(!in_array($elem["empNum"],$processedArray)){
$processedArray[] = $elem["empNum"];
finalOutput[] = $elem;
}
}
当我在CatalogController中执行此操作时:
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
但是,就在那一行之前,我验证我是否正确地获得了我的等级并且看起来就是这样:
$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)
实体有一个复合键:levelId + catalogCode。
考虑到主键CatalogLevel
不为空,我不明白这个错误......
目录实体
catalogCode
CatalogLevel实体
/**
* @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);
}
}
我想提醒您,当我显示预填表格时,editAction上的这个错误(在addAction上效果非常好)。
感谢您的帮助!
答案 0 :(得分:0)
我认为那是因为你没有在实体CatalogLevel中自动增加id。尝试添加以识别此代码:
@ORM\GeneratedValue(strategy="AUTO")
答案 1 :(得分:0)
您在创建实体的方式上遇到了一些问题。您应该使用自动生成策略。还有" @ORM \ Id"注释是唯一标识符。
此外,您的" JoinColumn"是不正确的。您需要参考"目录"实体及其ID(标识符)。不需要2" @ORM \ Id" CatalogLevel类中的条目。
所以做出这些改变:
/**
* @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;
...