2017-10-24 9 views
2

エンティティレコードを他のエンティティとの間で保持するクローンを作成しようとしています。私はいくつかのエンティティオブジェクトを正常にクローン化しましたが、この1対多数のエンティティ関係は私に挑戦しました。私はチャレンジへの進展なしに与えられたエラーメッセージに関する同様の質問を見直しました。Symfony/Doctrineでクローンされたエンティティオブジェクトを永続化する方法

正しいレコードが照会され、ループスルーされ、クローンされて配列に格納されます。 I Iは、配列をコードし、存続することを試みた アレイ

与えられ、パラメータ1はエンティティ・オブジェクトであることを期待)アレイを保持することを試みたが、エラー

のEntityManager#が(持続したのに私エラー

クラス取得 'のSymfony \コンポーネント\ HttpFoundation \ JsonResponseは' チェーン構成された名前空間NameOfBundle \エンティティでは見られない ました。このコードは以下

Iアレイを持続することができない私のコントローラで

$quoteItemAddWorkCollection = $em->getRepository('UniflyteBundle:QuoteItemAdditionalWork')->findBy($params); 
    $quoteItemDeliverableCollection = $em->getRepository('UniflyteBundle:QuoteItemDeliverable')->findBy($params); 

    if (!empty($quoteItemAddWorkCollection)) { 
     $quoteItemAddWorkArray = []; 
     foreach ($quoteItemAddWorkCollection as $quoteItemAddWorkItem) { 
      $quoteItemAddWorkItemClone = clone $quoteItemAddWorkItem; 
      array_push($quoteItemAddWorkArray, $quoteItemAddWorkItemClone); 
     } 
     $quoteItemAddWorkCollection = new JsonResponse($quoteItemAddWorkArray); 

     $em->persist($quoteItemAddWorkCollection); 

である、私が信じる最初JSONに、それをコードしなければなりません。私は間違って何をしていますか?

答えて

1

ここでは、Doctrineの概念の誤解があると思います。教義の面では、各エンティティ:

  • UniflyteBundle:QuoteItemAdditionalWork

  • UniflyteBundle:QuoteItemDeliverable

    、およびその関係のいずれかが、Mappingという名前の設定を使用して、持続得ることができました。

、仕事にどのインメモリオブジェクトを、これを取得するには、管理エンティティクラスのインスタンスでなければなりません。

Doctrineにこのような魔法はありません。一度に多くの未知のオブジェクトを永続させることはできません。あなたの新しいクローン化されたオブジェクトを永続化する前に、必要な関係を設定することに注意してください

foreach ($quoteItemAddWorkCollection as $quoteItemAddWorkItem) { 

    $quoteItemAddWorkItemClone = clone $quoteItemAddWorkItem; 
    $quoteItemAddWorkItemClone->setId(null); 

    // Set relationships here ... 

    $em->persist($quoteItemAddWorkItemClone); 
} 

:あなたはそれらを、一つずつループ内を持続します。あなたが使用したい場合は

、1はあなたがループ内で、それらの関係を割り当てることができ、持続:

class SomeParent 
{ 
    // @ORM\OneToMany(targetEntity="QuoteItemAdditionalWork", mappedBy="parent", cascade={"persist"}) 
    private $quoteItemAddWork; 
} 
+0

感謝:

foreach ($quoteItemAddWorkCollection as $quoteItemAddWorkItem) { $quoteItemAddWorkItemClone = clone $quoteItemAddWorkItem; $quoteItemAddWorkItemClone->setId(null); $someParentCollection->add($quoteItemAddWorkItemClone); } $em->persist($someParentCollection); 

後者の方法で、マッピング設定にcascadeを設定することができます必要がありますあなたは私を真っ直ぐにしてくれた。持続性の機能性と可能性を完全に理解していませんでした。ループ内の各クローンを持続させることは非常に効果的でした。 – drwoodchip

+0

'persist'を使って、あなたはDoctrineに言っています:* Hey!このエンティティに加えられた変更を追跡してください*。したがって、エンティティごとに1回だけ呼び出す必要があります。 – Trix

関連する問題