我正在使用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实体上手动调用持久化操作?
感谢。
答案 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(保存数据)评论