【问题标题】:Symfony3 Edit Entity : Error Missing value for primary keySymfony3 编辑实体:错误缺少主键值
【发布时间】:2016-10-14 00:09:51
【问题描述】:

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

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

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);
    }
}

目录级实体

/**
 * @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;
    }
}

我想提醒您,当我显示预先填写的表单时,editAction 上发生了此错误(它在 addAction 上效果很好)。

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    我认为这是因为您没有在实体 CatalogLevel 中自动增加 id。尝试将此代码添加到 id:

    @ORM\GeneratedValue(strategy="AUTO")
    

    【讨论】:

    • 感谢您的回复,但我没有为 CatalogLevel 使用自动递增 id,因为我使用 jquery 创建树,并在提交后使用表单数据修复 id。例如,级别 id 是这样的:item-1、item-2、item-xx。保存在数据库中效果很好。我的“catalogue_niveau”表中有我的所有级别数据。此外,我的错误发生在 AbstractProxyFactory 类上,而不是直接发生在 Entity CatalogLevel 上。
    • 好的,所以我不知道可能是什么原因,但有一种更简单的方法可以做到这一点。您可以使用doctrine tree extension。所有魔法都在一张桌子上。
    • 我不知道,谢谢!我会看看它是否符合我的结构。
    【解决方案2】:

    您创建实体的方式存在一些问题。您应该使用自动生成策略。 “@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;
         ...
    

    【讨论】:

    • 感谢您的回复,但我没有为 Catalog 和 CatalogLevel 使用自动增量 ID。用户可以输入目录代码,该代码用作主键。为了获得级别的唯一标识符,我使用了一个由目录代码和级别 id 组成的组合键,我在提交表单后获得(我在 jquery 中构建了一个拖放树,并在 js 中生成了 id)。保存在数据库中效果很好。我的“catalogue_niveau”表中有我的所有级别数据。此外,我的错误发生在 AbstractProxyFactory 类上,而不是直接发生在 Entity CatalogLevel 上。
    • 我在 Internet 上找到了避免此错误的方法:删除实体 CatalogLevel 中 $catalogCode 属性的 @ORM\Id。正在显示编辑表单,并预先填充了级别数据。但我不认为这是一个可行的解决方案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2018-12-27
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多