2016-06-13 22 views
1

製品カタログのツリー構造を作成しようとしています。 カタログには複数のレベルがあり、レベルには複数の製品を含めることができます。Symfony3エンティティの編集:エラープライマリキーの値がありません

私は、データベースに私の構造を保存するために管理が、私はそれを編集したいとき、私はこのエラーを持っている

:ちょうど、

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

しかし:

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でこれを行うとき、その前にレベルを正しく取得しているかどうかを確認してみてください。

// 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エンティティには、複合キーkey: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がないためだと思います。このコードにIDを追加してみてください:

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

おかげで、私はjQueryを使って私のツリーを作成し、私は後に提出したフォームデータとIDを修正するので、私はCatalogLevelのための自動インクリメントIDを使用しないでください。たとえば、レベルIDはitem-1、item-2、item-xxのようなものです。 データベースの保存がうまく機能します。 "catalogue_niveau"テーブルにすべてのレベルデータがあります。さらに、AbstractProxyFactoryクラスで、エンティティCatalogLevelに直接的にではなくエラーが発生しました。 – Felurian

+0

だから、何が原因か分かりませんが、簡単な方法があります。 [doctrine tree extension](https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/tree.md#including-extension)を使うことができます。 1つのテーブルにすべての魔法。 – ciurciurek

+0

私はそれを知らない、ありがとう!それが私の構造に対応しているかどうかがわかります。 – Felurian

0

エンティティを作成する方法にはいくつか問題があります。自動生成戦略を使用する必要があります。また、 "@ORM \ Id"注釈は固有の識別子です。

また、 "JoinColumn"も正しくありません。あなたは "Catalog"エンティティを参照する必要があり、それは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 and CatalogLevelには自動増分IDは使用していません。ユーザーはカタログのコードを入力することができ、このコードは主キーとして使用されます。 レベルの一意の識別子を持つために、フォームを送信した後に取得するカタログコードとレベルIDで構成された複合キーを使用します(jqueryのドラッグ&ドロップツリーを作成し、idsはjsで生成されます)。 データベースに保存するとうまくいきます。 "catalogue_niveau"テーブルにすべてのレベルデータがあります。さらに、AbstractProxyFactoryクラスで、エンティティCatalogLevelに直接的にではなくエラーが発生しました。 – Felurian

+0

このエラーを回避する方法をインターネット上で見つけました。エンティティCatalogLevelの$ catalogCodeプロパティの@ORM \ Idを削除します。 編集フォームが表示されており、レベルデータがあらかじめ入力されています。しかし、私はこれが実行可能な解決策だとは思わない... – Felurian

関連する問題