Symfony2 / Doctrine: Как повторно сохранить объект с OneToMany в виде новой каскадной строки

Во-первых, этот вопрос похож на Как повторно сохранить объект как другую строку в Doctrine 2

Разница в том, что я пытаюсь сохранить данные внутри объекта, который имеет отношения OneToMany. Я хотел бы повторно сохранить объект как новую строку в родительском объекте (на стороне «один»), а затем как новые строки в каждом последующем дочернем элементе (на стороне «многие»).

Для простоты я использовал довольно простой пример Класса, в котором много учеников.

Итак, у меня может быть ClassroomA с id = 1 и в нем 5 учеников (с 1 по 5).Я хотел бы знать, как я мог бы в Doctrine2 взять эту сущность и повторно сохранить ее в базе данных (после возможных изменений данных) с новыми идентификаторами повсюду и исходными строками, не затронутыми во время сохранения / сброса.

Давайте сначала определим наши Doctrine Entities.

Сущность Класса:

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 ============

}

Сущность Ученика:

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 ============
}

И наша общая функция Действия:

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');
}

Я пробовал использовать клонирование, но это сохранило только родительские отношения (Класс в нашем примере) с новым идентификатором, в то время как данные о детях (ученики) были обновлены по исходным идентификаторам.

Заранее благодарим за любую помощь.

18
задан Community 23 May 2017 в 11:46
поделиться