[英]Doctrine 2: inserting data into an entity with associations
通過在向數據庫中添加新實體時添加條件來解決,它檢查實體是否不為空……顯然有空實體試圖保存。 現在控制器代碼如下所示:
...
$ciudades_id = explode(';', $this->getRequest()->getParam('ciudades_id'));
foreach($ciudades_id as $ciudad_id){
$ciudad = $this->_em->find("Application_Model_Ciudades", intval($ciudad_id));
if($ciudad!= null){
$carrera->getCiudad()->add($ciudad);
}
}
$instituciones_id = explode(';', $this->getRequest()->getParam('instituciones_id'));
foreach($instituciones_id as $institucion_id){
$institucion = $this->_em->find("Application_Model_Instituciones", intval($institucion_id));
if($institucion != null){
$carrera->getInstituciones()->add($institucion);
}
}
...
感謝在#doctrine IRC 頻道提供幫助的人:)
這是我的問題...我得到了一個名為“Carreras”(職業)的實體,它有一些關聯,並且新的職業通過 Web 表單添加到數據庫中。 職業對我來說是一個測試,有問題和其他屬性,用戶可以選擇申請該測試的城市和機構。
因此,當我嘗試在實體上保存新數據時出現此錯誤:
An error occurred
Application error
Exception information:
Message: A new entity was found through the relationship
'Application_Model_Carreras#ciudad' that was not configured
to cascade persist operations for entity: Doctrine\ORM\UnitOfWork@.
Explicitly persist the new entity or configure cascading persist
operations on the relationship. If you cannot find out which entity
causes the problem implement 'Application_Model_Ciudades#__toString()'
to get a clue.
這是“Carreras”的模型
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity
* @Table(name="carreras")
*/
class Application_Model_Carreras
{
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/** @Column(type="string") */
private $nombre;
/**
* @ManyToMany(targetEntity="Application_Model_PruebasCarrera")
* @JoinTable(name="Carreras_PruebasCarrera",
* joinColumns={@JoinColumn(name="carreras_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="pruebascarrera_id", referencedColumnName="id")}
* )
*/
private $pruebas;
/** @Column(type="integer") */
private $valor;
/** @Column(type="date") */
private $fechainicio;
/** @Column(type="date") */
private $fechafin;
/**
* This association causes error
* @ManyToMany(targetEntity="Application_Model_Ciudades")
* @JoinTable(name="carrera_ciudades",
* joinColumns={@JoinColumn(name="carrera_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="ciudad_id", referencedColumnName="id")}
* )
*/
private $ciudad;
/**
* @ManyToMany(targetEntity="Application_Model_Instituciones")
* @JoinTable(name="carrera_instituciones",
* joinColumns={@JoinColumn(name="carrera_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="institucion_id", referencedColumnName="id")}
* )
*/
private $instituciones;
public function __construct()
{
$this->pruebas = new ArrayCollection();
$this->ciudad = new ArrayCollection();
$this->instituciones = new ArrayCollection();
}
public function setNombre($nombre){
$this->nombre = $nombre;
}
public function setValor($valor){
$this->valor = $valor;
}
public function setFechainicio($fechainicio){
$this->fechainicio = $fechainicio;
}
public function setFechafin($fechafin){
$this->fechafin = $fechafin;
}
public function getCiudad(){
return $this->ciudad;
}
public function getPruebas(){
return $this->pruebas;
}
public function getInstituciones(){
return $this->instituciones;
}
}
現在控制器的動作:
/*
* This is an action for adding a new career
*/
public function agregarAction()
{
$formtest = new Admin_Form_AgregarCarrera();
$this->view->formtest = $formtest;
if ($this->getRequest()->isPost() && $this->view->formtest->isValid($this->_getAllParams()))
{
/*
* If the form is okay creating new Carreer model object
* This model has some attributes and three associations (for now)
* you can see them later in detail
*/
$carrera = new Application_Model_Carreras();
$carrera->setNombre($this->getRequest()->getParam("nombre"));
$carrera->setValor($this->getRequest()->getParam("valor"));
$carrera->setFechainicio(new \DateTime($this->getRequest()->getParam("fechainicio")));
$carrera->setFechafin(new \DateTime($this->getRequest()->getParam("fechafin")));
/*
* This is the first association. It's working fine (for now)
*/
$pruebas = $this->getRequest()->getParam("pruebas");
foreach($pruebas as $prueba){
if($prueba != '0'){
$tmp = $this->_em->find("Application_Model_PruebasCarrera", $prueba);
$carrera->getPruebas()->add($tmp);
}
}
/*
* This is the second associations, i'm getting the error with this one
*/
$ciudades_id = explode(';', $this->getRequest()->getParam('ciudades_id'));
foreach($ciudades_id as $ciudad_id){
$ciudad = $this->_em->find("Application_Model_Ciudades", intval($ciudad_id));
$carrera->getCiudad()->add($ciudad);
}
/*
* This is the third one. Nothing to say about this.
*/
$instituciones_id = explode(';', $this->getRequest()->getParam('instituciones_id'));
foreach($instituciones_id as $institucion_id){
$institucion = $this->_em->find("Application_Model_Instituciones", intval($institucion_id));
$carrera->getInstituciones()->add($institucion);
}
$this->_em->persist($carrera);
$this->_em->flush();
//$this->redirector->gotoSimpleAndExit('index','Carrera','admin');
}
}
好吧,我不知道還有什么要展示的……如果您能幫助我,請發表評論:)
- 編輯
我在模型“Carreras”的關聯中添加了 cascade={"persist"} 並且錯誤發生了變化:
An error occurred
Application error
Exception information:
Message: Class Doctrine\ORM\UnitOfWork is not a
valid entity or mapped super class.
現在這是“Ciudades”模型,它存儲可用於測試的城市,並與存在於每個城市的機構相關聯。
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity
* @Table(name="ciudades")
*/
class Application_Model_Ciudades {
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/** @Column(type="string") */
private $ciudad;
/** @Column(type="string") */
private $departamento;
/** @Column(type="string") */
private $pais;
/**
* @ManyToMany(targetEntity="Application_Model_Instituciones")
* @JoinTable(name="Ciudades_Instituciones",
* joinColumns={@JoinColumn(name="ciudades_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="instituciones_id", referencedColumnName="id")}
* )
*/
private $instituciones;
public function __construct()
{
$this->instituciones = new ArrayCollection();
}
public function getCiudad(){
return $this->ciudad;
}
public function getId(){
return $this->id;
}
public function getInstituciones(){
return $this->instituciones;
}
}
現在這是“Instituciones”模型,它存儲可用於測試的機構。
/**
* @Entity
* @Table(name="instituciones")
*/
class Application_Model_Instituciones {
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/** @Column(type="string") */
private $nombre;
public function getId(){
return $this->id;
}
public function getNombre(){
return $this->nombre;
}
}
現在這是“PruebasCarrera”模型,對我來說這個模型實體存儲了測試的問題,每個問題都可以有一個支持該問題的合作伙伴:
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity
* @Table(name="pruebas_carrera")
*/
class Application_Model_PruebasCarrera extends Application_Model_PruebasBase{
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/**
* @ManyToMany(targetEntity="Application_Model_Patrocinadores")
* @JoinTable(name="pruebascarrera_patrocinadores",
* joinColumns={@JoinColumn(name="pruebas_id", referencedColumnName="id", unique="true")},
* inverseJoinColumns={@JoinColumn(name="patrocinadores_id", referencedColumnName="id", unique=false)}
* )
*/
protected $patrocinadores;
/** @Column(type="string") */
private $respuesta;
public function __construct() {
$this->patrocinadores = new ArrayCollection();
}
public function setRespuesta($respuesta){
$this->respuesta = $respuesta;
}
public function getPatrocinadores(){
return $this->patrocinadores;
}
public function getId(){
return $this->id;
}
public function getRespuesta(){
return $this->respuesta;
}
}
請出示相關實體代碼:Application_Model_Ciudades Application_Model_PruebasCarrera Application_Model_Instituciones
此時我認為您應該將 cascade={"persist"} 添加到 Application_Model_Ciudades 實體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.