Po pierwsze, kwestia ta jest podobna do How to re-save the entity as another row in Doctrine 2Symfony2/Doctrine: Jak ponownie zapisać podmiot z OneToMany jako kaskadowych nowego wiersza
Różnica polega na tym, że próbuję zapisać dane w obrębie danego podmiotu ma związek OneToMany. Chciałbym ponownie zapisać encję jako nowy wiersz w jednostce nadrzędnej (po stronie "jednej"), a następnie jako nowe wiersze w każdym następnym potomku (po stronie "wiele").
Użyłem całkiem prostego przykładu Classroom, w którym wielu uczniów ma prostotę.
Tak więc ja może mieć ClassroomA z id = 1 i ma 5 uczniów (ids 1 do 5). Chciałbym wiedzieć, jak mogłem, w ramach Doctrine2, zabrać tę encję i ponownie zapisać ją w bazie danych (po potencjalnych zmianach danych) z nowymi identyfikatorami w całym tekście, a pierwotne wiersze pozostały nietknięte podczas utrzymywania/koloru.
Najpierw określ nasze jednostki doktryny.
The Classroom Podmiot:
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 ============
}
źrenicy Podmiot:
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 ============
}
A nasz rodzajowy funkcja Działanie:
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');
}
Próbowałem za pomocą klona ale tylko zaoszczędziliśmy relacja rodzica (Classroom w naszym przykładzie) ze świeżym ID, a dane dzieci (uczniowie) zostały zaktualizowane ainst oryginalne identyfikatory.
Z góry dziękuję za wszelką pomoc.
że to zrobił, dziękuję. Miałem nadzieję, że uniknę pętli w funkcji, ale to było najprostsze rozwiązanie na końcu. Widziałem, że klasa EntityManager Doctrine ma funkcję "kopii" opisaną jako "Tworzy kopię danego obiektu, może tworzyć płytką lub głęboką kopię". Jedynym haczykiem jest to, że funkcja ma jedną linię, która zgłasza wyjątek "Nie zaimplementowano". – dividebyzeroZA
FYI w aktualnej Doctrine2 możesz zaimplementować własny '__clone' i zostanie on wywołany. – jcbwlkr