Doctrine orm 更新条令汇编

Doctrine orm 更新条令汇编,doctrine-orm,doctrine,zend-framework2,Doctrine Orm,Doctrine,Zend Framework2,我正在做一个调查项目,我得到了3个实体,SurveYumFlage,surveyQuestionumfrageFrage和surveyAnswerumfrageAntwort。 以下是删除所有不必要字段的实体: namespace Umfrage\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Coll

我正在做一个调查项目,我得到了3个实体,SurveYumFlage,surveyQuestionumfrageFrage和surveyAnswerumfrageAntwort。 以下是删除所有不必要字段的实体:

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);
?>
添加调查工作正常,同时删除,调查及其相关问题/答案将从数据库中删除。只有更新操作未按预期工作。调查和问题会更新,但对于答案,我会收到一个插入,而不是更新,这会导致数据库中出现重复条目。映射代码有什么问题


提前感谢您的帮助

也发布您的视图文件好的,我添加了视图文件,让我知道,如果需要任何其他代码,好的,我认为您在这里有问题$id=int$this->params->fromRoute'id',0;如果$id{return$this->redirect->toRoute'umfrage',array'action'=>'add';}发生的情况是,当您发布数据时,您通过某种方式无法将id传递给编辑操作,请尝试执行类似这样的操作$id=int$this->params->fromRoute'id',0;如果$id{$id=$request->getPost'id';//这不是一个优化的解决方案,但我认为它现在可以工作,你可以很容易地修改它来解决你的问题。}id是可以的,正如我写的,调查和问题都会更新,只有第三部分没有答案。到目前为止,我已经成功地实现了这一点,但在DB中,答案仍然没有更新。旧的设置为空,而编辑的仍被插入。还有什么想法吗?当我假设你设法来编辑动作时,我认为你是如何被重定向到添加动作的,所以,看看你的观点,这很好,你的路线也很好,这里唯一值得怀疑的是,你被重定向到从编辑动作添加