2016-08-26 5 views
3

symfonyフォームを通じて新しいエンティティを追加する際に問題があります。新しいエンティティが関係を介して見つかりました - フォームからのみ

私のDBは次のようになります。

$builder 
    ->add('document', 'entity', array(
     'label' => 'Dokument', 
     'class' => 'AppBundle\Entity\Document', 
     'query_builder' => function (EntityRepository $er) use ($accountId) { 
      return $er->createQueryBuilder('d') 
       ->join('d.account', 'a') 
       ->where('a.id = :account_id') 
       ->setParameter('account_id', $accountId); 
     }, 
     'attr' => array(
      'class' => 'form-control', 
     ))); 

私は私が手の形を通じて文書を選択しています: ドキュメントは、すべての項目グループ

私のフォームを持っている多くのアイテムが含まれていますエラー

新しいエンティティが関係を通じて見つかりました。

しかし、私はそれを手動でやっているとき、それは良い作品(DBからDocumentを取得し、Itemに設定し、新しいItemインスタンスを作成します)。

フォームのDocumentインスタンスがItemインスタンスとの接続を持たず、新しいエンティティとして認識されたようです。

私のORMファイル:

ドキュメント:

AppBundle\Entity\Document: 
    type: entity 
    table: document 
    id: 
     id: 
      type: integer 
      nullable: false 
      unsigned: true 
      id: true 
      generator: 
       strategy: IDENTITY 
    fields: 
     documentId: 
      type: string 
      nullable: true 
      length: 50 
      fixed: false 
      column: document_id 
     invoiceId: 
      type: integer 
      nullable: true 
      unsigned: true 
      column: invoice_id 
     invoiceDate: 
      type: datetime 
      nullable: true 
      column: invoice_date 
     modified: 
      type: boolean 
      nullable: false 
      default: '0' 
    oneToMany: 
     items: 
      targetEntity: Item 
      mappedBy: document 
     children: 
      targetEntity: Document 
      mappedBy: parent 
    manyToOne: 
     parent: 
      targetEntity: Document 
      cascade: { } 
      mappedBy: null 
      inversedBy: null 
      joinColumns: 
       parent_id: 
        referencedColumnName: id 
      orphanRemoval: false 
     account: 
      targetEntity: Account 
      cascade: ['persist'] 
      mappedBy: null 
      inversedBy: document 
      joinColumns: 
       account_id: 
        referencedColumnName: id 
      orphanRemoval: false 
    lifecycleCallbacks: { } 

アイテム:

AppBundle\Entity\Item: 
    type: entity 
    table: item 
    id: 
     id: 
      type: integer 
      nullable: false 
      unsigned: true 
      id: true 
      generator: 
       strategy: IDENTITY 
    fields: 
     quantity: 
      type: integer 
      nullable: true 
      unsigned: true 
    manyToOne: 
     group: 
      targetEntity: Group 
      cascade: ['persist'] 
      mappedBy: null 
      inversedBy: items 
      joinColumns: 
       group_id: 
        referencedColumnName: id 
      orphanRemoval: false 
     document: 
      targetEntity: Document 
      cascade: ['persist'] 
      mappedBy: null 
      inversedBy: item 
      joinColumns: 
       document_id: 
        referencedColumnName: id 
      orphanRemoval: false 
    lifecycleCallbacks: { } 

詳細

ワーキングコード:

/** 
* @return boolean 
*/ 
public function saveItem(Item $item) 
{ 
    try { 

     $document = $this->em->getRepository('AppBundle:Document')->find($item->getDocument()->getId()); 

     $objDate = new \DateTime(); 
     $item 
      ->setDocument($document) 
      ->setDateFrom(new \DateTime($item->getDateFrom())) 
      ->setDateTo(new \DateTime($item->getDateTo())) 
      ->setCreateDate($objDate) 
      ->setFreePaperVersion(true) 
      ->setAccess(0); 

     $this->em->persist($item); 
     $this->em->flush(); 
     return true; 
    } catch 
    (Exception $ex) { 
     return false; 
    } 
} 

に動作していないコード:

/** 
* @return boolean 
*/ 
public function saveItem(Item $item) 
{ 
    try { 
    $objDate = new \DateTime(); 
     $item 
      ->setDateFrom(new \DateTime($item->getDateFrom())) 
      ->setDateTo(new \DateTime($item->getDateTo())) 
      ->setCreateDate($objDate) 
      ->setFreePaperVersion(true) 
      ->setAccess(0); 

     $this->em->persist($item); 
     $this->em->flush(); 
     return true; 
    } catch 
    (Exception $ex) { 
     return false; 
    } 
} 
+2

新しいエンティティを維持する 'document'関係の' cascade:['persist'] 'があります。新しいインスタンスがあるのに 'cascade'オプションが設定されていないときに表示されるエラーです。問題の原因が他の場所にあるように見えますが、見つけ出すための情報が少なすぎます。 –

+0

カスケード:['persist'] 'がないと、エラーが表示されます。コードが間違っています。しかし、教義はそれを新しいエンティティとして認識します。なぜなら、私が「持続」を追加すると、それは関係の階層(新しいものとして他のエンティティを認識する)に上がるからです。それが最後のものに達するまで、それは私に "Undefined index"エラーを与えます。 – prgj83

+1

フォーム上で動作するコントローラコードと、それが動作することを述べた「手動」操作を提供できますか? –

答えて

0

私が思うあなたの問題の理由は、あなたが「アイテム」で無効inversedBy定義「アイテム」を持っていること、あるエンティティのプロパティの「ドキュメント"ドキュメントエンティティのプロパティ名 "items"のため、アイテムに変更してください。

bin/console doctrine:schema:validateを実行して、有効なスキーマ定義があることを確認しますか?

doctrine:schema:update --forceを実行してデータベーススキーマを更新することを忘れないでください。

関連する問題