2017-10-24 1 views
2

Ich versuche, einen Entitätsdatensatz zusammen mit den Beziehungen zwischen anderen Entitäten zu klonen. Ich habe einige Entitätsobjekte erfolgreich geklont, aber diese Beziehung zwischen einem und vielen Entitäten hat mich herausgefordert. Ich habe ähnliche Fragen bezüglich der Fehlermeldung, die mir gegeben wurde, wiederholt, ohne die Herausforderung zu bestehen.Wie geklontes Entitätsobjekt in Symfony/Doctrine beibehalten wird

Die korrekten Datensätze werden abgefragt, durchgeschleift und geklont und dann in einem Array gespeichert. Ich habe versucht das Array bestehen bleiben aber erhalten Fehler

EntityManager # persistieren() erwartet Parameter 1 ein Entitätsobjekt zu sein, Array

I, dann das Array zu codieren versucht und bestehen bleiben, aber ich erhalten Fehler

Die Klasse 'Symfony \ Component \ HttpFoundation \ JsonResponse' wurde nicht in der Kette konfiguriert Namespaces NameOfBundle \ Entity gefunden.

Dieser Code unten ist in meinem Controller

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

Ich kann nicht ein Array bestehen bleiben, ich habe es zu kodieren, JSon ersten glaube ich. Was mache ich falsch?

Antwort

1

Ich glaube, Sie haben hier ein falsches Verständnis von Doctrine-Konzepten. In Bezug auf die Lehre, jede Entität:

  • UniflyteBundle:QuoteItemAdditionalWork

    und

  • UniflyteBundle:QuoteItemDeliverable

    , und alle seine Beziehungen konnte, blieb erhalten, unter Verwendung einer Konfiguration mit dem Namen Mapping.

Um dies in Arbeit zu bekommen, jede In-Memory Objekt muss eine Instanz einer verwaltete Einheit Klasse sein.

Es gibt keine solche Magie in Doctrine, um so viele unbekannte Objekte auf einmal zu beharren. Sie können sie bestehen bleiben, one-by-one in einer Schleife:

foreach ($quoteItemAddWorkCollection as $quoteItemAddWorkItem) { 

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

    // Set relationships here ... 

    $em->persist($quoteItemAddWorkItemClone); 
} 

Denken Sie daran, alle erforderlichen Beziehungen zu setzen, bevor Sie Ihren neuen geklonten Objekte persistierenden.

Wenn Sie verwenden möchten, eine fortbestehen, können Sie ihre Beziehungen zuordnen können, in einer Schleife:

foreach ($quoteItemAddWorkCollection as $quoteItemAddWorkItem) { 

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

    $someParentCollection->add($quoteItemAddWorkItemClone); 
} 

$em->persist($someParentCollection); 

letzteren Verfahren muss man cascade auf Mapping-Konfiguration einzustellen:

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

Thank du, dass du mich richtig gestellt hast. Ich habe die anhaltende Funktionalität und das Potenzial nicht vollständig verstanden. Es hat sich bewährt, jeden Klon in der Schleife zu behalten. – drwoodchip

+0

mit 'persist', erzählen Sie Lehre: * Hey! Verfolgen Sie bitte alle Änderungen, die an dieser Stelle vorgenommen wurden *. Sie müssen es NUR EINMAL pro Einheit aufrufen. – Trix

Verwandte Themen