1

私は調査プロジェクトに取り組んでおり、調査(umfrage)、調査質問(umfrageFrage)、調査回答(umfrageAntwort)の3つのエンティティを取得しました。エンティティは次のとおりです(不要なフィールドをすべて削除しました):

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

コントローラ アクション:

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

調査の追加は正常に機能し、削除も、調査とそれに関連する質問/回答が DB から削除されます。更新アクションのみが期待どおりに機能しません。調査と質問は更新されますが、回答については、更新ではなく挿入を受け取るため、DB にエントリが重複します。マッピング (コード) の何が問題になっていますか?

よろしくお願いします。

4

0 に答える 0