更新Doctrine集合

时间:2013-08-21 09:00:44

标签: doctrine-orm doctrine zend-framework2

我正在进行一项调查项目,我得到了3个实体,调查(umfrage),surveyQuestion(umfrageFrage)和surveyAnswer(umfrageAntwort)。 以下是实体(删除了所有不必要的字段):

namespace Umfrage\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

/**
 * Umfrage
 *
 * @ORM\Table(name="umfrage")
 * @ORM\Entity
 */
class Umfrage
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Fragen
     *
     * @ORM\OneToMany(targetEntity="Umfrage\Entity\UmfrageFrage", mappedBy="umfrage", cascade={"persist","remove"})
     */
    private $fragen;

    public function __construct() {
        $this->fragen = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set fragen
     *
     * @param \Umfrage\Entity\UmfrageFrage $fragen
     *
     * @return UmfrageFrage
     */
    public function setFragen($fragen)
    {
        $this->fragen = $fragen;
        return $this;
    }

     /** Get fragen
     *
     * @param \Umfrage\Entity\UmfrageFrage $fragen
     *
     * @return UmfrageFrage
     */
    public function getFragen() {
        return $this->fragen;
    }

    public function addFragen(Collection $fragen)
    {
        foreach ($fragen as $frage) {
            $frage->setUmfrage($this);            
            $this->fragen->add($frage);
        }
    }

    public function removeFragen(Collection $fragen)
    {
        foreach ($fragen as $frage) {
            $frage->setUmfrage(null);
            $this->fragen->removeElement($frage);
        }
    }
}

问题:

namespace Umfrage\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;


/**
* UmfrageFrage
*
* @ORM\Table(name="umfrage_frage")
* @ORM\Entity
 */
class UmfrageFrage
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \Umfrage\Entity\Umfrage
     *
     * @ORM\ManyToOne(targetEntity="Umfrage\Entity\Umfrage", inversedBy="fragen")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="umfrage_id", referencedColumnName="id")
     * })
     */
    private $umfrage;

    /**
     * @var Antworten
     *
     * @ORM\OneToMany(targetEntity="Umfrage\Entity\UmfrageAntwort", mappedBy="umfrageFrage", cascade={"all"})
     */
    private $antworten;

    public function __construct() {
        $this->antworten = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set umfrage
     *
     * @param \Umfrage\Entity\Umfrage $umfrage
     *
     * @return UmfrageFrage
     */
    public function setUmfrage(\Umfrage\Entity\Umfrage $umfrage = null)
    {
        $this->umfrage = $umfrage;
        return $this;
    }

    /**
     * Get umfrage
     *
     * @return \Umfrage\Entity\Umfrage 
     */
    public function getUmfrage()
    {
        return $this->umfrage;
    }

    /**
     * Set antworten
     *
     * @param \Umfrage\Entity\UmfrageAntwort $antworten
     *
     * @return UmfrageAntwort
     */
    public function setAntworten($antworten)
    {
        $this->antworten = $antworten;
        return $this;
    }

     /** Get antworten
     *
     * @param \Umfrage\Entity\UmfrageAntwort $antworten
     *
     * @return UmfrageAntwort
     */
    public function getAntworten() {
        return $this->antworten;
    }

    public function addAntworten(Collection $antworten)
    {
        foreach ($antworten as $antwort) {
            $antwort->setUmfrageFrage($this);
            $this->antworten->add($antwort);
        }
    }

    public function removeAntworten(Collection $antworten)
    {
        foreach ($antworten as $antwort) {
            $this->antworten->removeElement($antwort);
        }
    }
}

答案:

namespace Umfrage\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

/**
 * UmfrageAntwort
 *
 * @ORM\Table(name="umfrage_antwort")
 * @ORM\Entity
 */
class UmfrageAntwort
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="bigint", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \Umfrage\Entity\UmfrageFrage
     *
     * @ORM\ManyToOne(targetEntity="Umfrage\Entity\UmfrageFrage", inversedBy="antworten")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="umfrage_frage_id", referencedColumnName="id")
     * })
     */
    private $umfrageFrage;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set umfrageFrage
     *
     * @param \Umfrage\Entity\UmfrageFrage $umfrageFrage
     *
     * @return UmfrageFrage
     */
    public function setUmfrageFrage($umfrageFrage)
    {
        $this->umfrageFrage = $umfrageFrage;
        return $this;
    }

    /**
     * Get umfrageFrage
     *
     * @return \Umfrage\Entity\UmfrageFrage 
     */
    public function getUmfrageFrage()
    {
        return $this->umfrageFrage;
    }
}

Controller行动:

public function editAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
        return $this->redirect()->toRoute('umfrage', array('action'=>'add'));
    }

    $umfrage = $this->getEntityManager()->find('Umfrage\Entity\Umfrage', $id);

    $form = new UmfrageForm($this->getEntityManager());
    $form->setHydrator(new DoctrineEntity($this->getEntityManager(),'Umfrage\Entity\Umfrage'));

    $form->bind($umfrage);

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setData($request->getPost());
        if ($form->isValid()) {

            $this->getEntityManager()->persist($umfrage);
            $this->getEntityManager()->flush();

            // Redirect to overview
            return $this->redirect()->toRoute('umfrage');
        }
    }
    $this->layout('layout/umfrage_backend');
    return new ViewModel(array(
        'id' => $id,
        'form' => $form
    ));
}

观点:

<?php
// module/Umfrage/view/umfrage/umfrage/edit.phtml:

use Doctrine\Common\Util\Debug;
$title = 'Umfrage bearbeiten';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>

<?php
$form = $this->form;
$form->setAttribute('action', $this->url(
                            'umfrage',
                            array(
                                'action' => 'edit',
                                'id'     => $this->id,
                            )
));
echo $this->ztbForm($form);
?>

添加调查工作正常,删除,调查及其相关问题/答案也会从数据库中删除。只有Update操作不能按预期工作。调查和问题已更新,但对于答案,我收到一个插入而不是更新,这会导致数据库中出现重复的条目。映射(代码)有什么问题?

提前感谢您的帮助!

0 个答案:

没有答案