首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原则2:将数据插入有关联的实体

原则2:将数据插入有关联的实体
EN

Stack Overflow用户
提问于 2012-06-04 06:36:49
回答 1查看 4.8K关注 0票数 1

通过在数据库中添加一个新实体时添加一个条件来解决问题,它检查该实体是否为空.很明显,有一些空实体试图被拯救。现在控制器代码如下所示:

代码语言:javascript
复制
...
$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); 
               }
           }
...

感谢那些在频道帮了忙的家伙

这是我的问题..。我有一个名为“Carrera”( carreers )的实体,它有一些关联,新的carreers使用web表单添加到数据库中。对我来说,旅行是一个测试,它有问题和其他贡献,用户可以选择申请该考试的城市和机构。

因此,当我试图保存实体上的新数据时,我会得到这个错误:

代码语言:javascript
复制
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.

这是“卡雷拉斯”的模型

代码语言:javascript
复制
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;
    }
}

现在在控制器上的动作:

代码语言:javascript
复制
 /*
     * 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');     
        }
    }

我不知道还能展示什么..。如果你能帮我的话,请评论:)

-编辑

我在模型“Carrera”的关联中添加了cascade={“持久化”},错误改变了:

代码语言:javascript
复制
An error occurred
Application error
Exception information:

Message: Class Doctrine\ORM\UnitOfWork is not a 
valid entity or mapped super class. 

现在这是"Ciudades“模型,它存储可供测试使用的城市,并与每个城市存在的机构相关联。

代码语言:javascript
复制
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“模型,它存储可用于测试的机构。

代码语言:javascript
复制
/**
 * @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“模型,对我来说,这个模型实体存储测试的问题,每个问题都可以有一个支持这个问题的合作伙伴:

代码语言:javascript
复制
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;
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-04 09:36:18

请显示相关实体的代码: Application_Model_Ciudades Application_Model_PruebasCarrera Application_Model_Instituciones

此时此刻,看看https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-associations.html#transitive-persistence-cascade-operations

此时,我认为您应该将cascade={“持久化”}添加到Application_Model_Ciudades实体中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10877224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档