Symfony3编辑实体:错误缺少主键的值

时间:2016-06-13 14:14:32

标签: doctrine entity primary-key symfony composite-key

我尝试为产品目录创建树结构。 目录可以包含多个级别,级别可以包含多个产品。

我设法将我的结构保存在数据库中但是当我想编辑它时,我有这个错误:

 $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上效果非常好)。

感谢您的帮助!

2 个答案:

答案 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;
     ...