In primo luogo, questa domanda è simile a How to re-save the entity as another row in Doctrine 2Symfony2/Doctrine: come ri-salvare un ente con un OneToMany come cascata nuova riga
La differenza è che io sto cercando di salvare i dati all'interno di un'entità che ha una relazione OneToMany. Vorrei ri-salvare l'entità come una nuova riga nell'entità padre (sul lato "uno") e poi come nuove righe in ogni figlio successivo (sul lato "molti").
Ho usato un esempio piuttosto semplice di una classe con molti studenti per semplificare la procedura.
Così potrei avere ClassroomA con id = 1 e ha 5 pupille (id da 1 a 5). Mi piacerebbe sapere come potrei, in Doctrine2, prendere quell'entità e salvarla nuovamente nel database (dopo i potenziali cambiamenti di dati) con tutti i nuovi ID e le righe originali non modificate durante il persist/flush.
Consente innanzitutto di definire le nostre entità di Doctrine.
The Classroom Entity:
namespace Acme\TestBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="classroom")
*/
class Classroom
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $miscVars;
/**
* @ORM\OneToMany(targetEntity="Pupil", mappedBy="classroom")
*/
protected $pupils;
public function __construct()
{
$this->pupils = new ArrayCollection();
}
// ========== GENERATED GETTER/SETTER FUNCTIONS BELOW ============
}
La pupilla Entity:
namespace Acme\TestBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="pupil")
*/
class Pupil
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $moreVars;
/**
* @ORM\ManyToOne(targetEntity="Classroom", inversedBy="pupils")
* @ORM\JoinColumn(name="classroom_id", referencedColumnName="id")
*/
protected $classroom;
// ========== GENERATED FUNCTIONS BELOW ============
}
E la nostra generica funzione Azione:
public function someAction(Request $request, $id)
{
$em = $this->getDoctrine()->getEntityManager();
$classroom = $em->find('AcmeTestBundle:Classroom', $id);
$form = $this->createForm(new ClassroomType(), $classroom);
if ('POST' === $request->getMethod()) {
$form->bindRequest($request);
if ($form->isValid()) {
// Normally you would do the following:
$em->persist($classroom);
$em->flush();
// But how do I create a new row with a new ID
// Including new rows for the Many side of the relationship
// ... other code goes here.
}
}
return $this->render('AcmeTestBundle:Default:index.html.twig');
}
Ho provato con il clone, ma che ha salvato solo il relazione genitore (Classroom nel nostro esempio) con un nuovo ID, mentre i dati dei bambini (Pupille) sono stati aggiornati ag prima degli ID originali.
Grazie in anticipo a qualsiasi assistenza.
Che ha fatto, grazie. Speravo di evitare di dover eseguire il ciclo in una funzione, ma questa era la soluzione più semplice alla fine. Ho visto che la classe EntityManager di Doctrine ha una funzione di "copia" descritta come "Crea una copia dell'entità data. Può creare una copia superficiale o profonda". L'unico problema è che la funzione ha una riga che genera un'eccezione "Non implementata". – dividebyzeroZA
FYI in corrente Doctrine2 è possibile implementare il proprio '__clone' e verrà chiamato. – jcbwlkr