Doctrine 2 - Zend Framework 2 - 无法与Form创建新关联

时间:2013-09-30 00:09:57

标签: php doctrine-orm zend-framework2

我正在使用Doctrine2开发我的第一个Zend Framework应用程序,我无法将工作简单地关联起来。编辑工作正常,但我无法使实体的创建正常工作。

我的实体是:

<?php

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class SpellListDetail{


     /** 
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Application\Entity\SpellList", inversedBy="spellDetails") 
     * @ORM\JoinColumn(name="SpellList_id", referencedColumnName="id", nullable=false) 
     */
    private $sList;
    /** 
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Application\Entity\Spell") 
     * @ORM\JoinColumn(name="Spell_id", referencedColumnName="id", nullable=false) 
     */
    private $spell;

    /** @ORM\Column(type="integer") */
    private $level;

    /** @ORM\Column(type="float") */
    private $areaValueOne;
    /** @ORM\Column(type="float") */
    private $areaValueTwo;
    /** @ORM\Column(type="float") */
    private $areaValueThree;
    /** @ORM\ManyToOne(targetEntity="Application\Entity\AreaType") */
    private $areaType;
    /** @ORM\Column(type="boolean") */
    private $areaLevel = false;

    /** @ORM\Column(type="integer") */
    private $durationValue;
    /** @ORM\Column(type="integer") */
    private $durationType;
    /** @ORM\Column(type="integer") */
    private $durationFail;           

    /** @ORM\Column(type="float") */
    private $rangeValue = 0;

    /** @ORM\Column(type="integer") */
    private $rangeType;

    /** @ORM\Column(length=2) */
    private $primaryClass;

    /** @ORM\Column(length=1) */
    private $subClass;

    /** @ORM\Column(type="boolean") */
    private $instantaneous = false;

    /** @ORM\Column(type="boolean") */
    private $points = true;

//Setters & getter

<?php

namespace Application\Entity;

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

/**
 * @ORM\Entity (repositoryClass="Application\Repositories\SpellList") 
 */
class SpellList{
    const OPEN_LIST = 1000;
    const CLOSED_LIST = 2000;
    const EVIL_LIST = 3000;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(length=40)
     */
    private $name;

    /**
     * @ORM\Column(type="text")
     */
    private $description;

    /**
     * @ORM\ManyToOne(targetEntity="Application\Entity\Realm")
     */
    private $realm;

    /**
     * @ORM\Column(type="integer")
     */
    private $type;

     /** @ORM\OneToMany(targetEntity="Application\Entity\SpellListDetail", mappedBy="sList", cascade={"persist", "remove"}) 
      *  @ORM\OrderBy({"level" = "ASC"})*/
    private $spellDetails;
//Setters & getters

第三个实体,Spell,是一个具有id,name和description的简单实体,没有映射,因为我试图避免不必要的数据库调用

这是控制器

public function createAction()
    {
        $form = new \Magic\Form\ListForm($this->model->getEntityManager());
        $form->setAttribute('action', '/magic/list/create');

        $spellList = new \Application\Entity\SpellList();
        $form->bind($spellList);

        if ($this->getRequest()->isPost()) {
            $form->setData($this->getRequest()->getPost());         
            if ($form->isValid()){
                foreach($spellList->getSpellDetails() as $detail){
                    $spell = $detail->getSpell();
                    if ($spell->getId() == null){
                        $this->model->getEntityManager()->persist($spell);
                        $this->model->getEntityManager()->flush();
                    }
                }                   
                $this->model->getEntityManager()->persist($spellList);
                //$this->model->getEntityManager()->flush();    
                $this->model->getEntityManager()->flush();
            }           
        }       
        $viewModel = new ViewModel(array('form' => $form));
        $viewModel->setTemplate('magic/list/edit.phtml');   
        return $viewModel;
    }

我收到了下一条错误消息

Entity of type Application\Entity\SpellListDetail has identity through a foreign entity Application\Entity\SpellList, however this entity has no identity itself. You have to call EntityManager#persist() on the related entity and make sure that an identifier was generated before trying to persist 'Application\Entity\SpellListDetail'. In case of Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL) this means you have to call EntityManager#flush() between both persist operations.

所以,如果我理解了这个消息,那么教义就不能保持整个关联,因为他试图首先坚持SpellListDetails而不是SpellList并抛出异常,因为SpellList没有id。我认为使用实体中的mappedBy和persist选项可以避免这种情况,所以我做错了什么?

有没有办法在SpellList实体上手动调用持久化操作?

感谢。

1 个答案:

答案 0 :(得分:3)

这里有一些错误,我会指出严格的前进

你的许多方面必须有这样的事情,我认为这是拼写的

  /**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

2ndly从同一个实体中删除详细的ID子句 (您的代码如下)

    /** 
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Application\Entity\SpellList", inversedBy="spellDetails") 
 * @ORM\JoinColumn(name="SpellList_id", referencedColumnName="id", nullable=false) 
 */
private $sList;
/** 
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Application\Entity\Spell") 
 * @ORM\JoinColumn(name="Spell_id", referencedColumnName="id", nullable=false) 
 */
private $spell

将其更改为

     /** 
 * @ORM\ManyToOne(targetEntity="Application\Entity\SpellList", inversedBy="spellDetails") 
 * @ORM\JoinColumn(name="SpellList_id", referencedColumnName="id", nullable=false) 
 */
private $sList;
/** 
 * @ORM\ManyToOne(targetEntity="Application\Entity\Spell",inversedBy="spellDetails") 
 * @ORM\JoinColumn(name="Spell_id", referencedColumnName="id", nullable=false) 
 */
private $spell

你需要知道的是,当存在关系并且关系是正确的时候,Doctrine会自动映射foregin键与约束的关系。

你也错过了

  inversedBy="spellDetails"

与你的拼写实体的关系,我已经把它放在编辑的代码中。我只是在回答实际上是关联的问题。我还没有看到你的控制器,所以如果你遇到问题持续/ Flush(保存数据)评论