Doctrine 2.4无法持久存储/插入多个关联实体

时间:2018-02-08 18:40:13

标签: php doctrine many-to-many persistence xmlmapper

人们可以帮帮我吗?即时通讯在Doctrine 2.4上有一个实体(Solicitud)存在问题,当我将对象传递给实体管理器进行持久化和刷新时,该实体已将所有关联对象存储在其属性中。

完全描述的关系应该是......

  1. Usuario-> Solicitudes(一对多)
  2. Solicitud-> Servicios(多对多)
  3. 类别 - > Servicios(一对多)
  4. 我确实从我的XML Mapping ...

    生成了实体和数据库结构

    在我的“solicitud”XML上,我已经定义了下面的关系...当我执行命令时,中间表得到了有效的创建:

    vendor\bin\doctrine orm:schema-tool:update --force
    

    有两列,一切都好。

    这是关于定义多对多关系的字段的“Solicitud”

    <many-to-many field="servicios" target-entity="Servicio">
    <cascade>
    <cascade-persist/>
    </cascade>
    <join-table name="solicitud_servicio">
    <join-columns>
    <join-column name="id_solicitud" referenced-column-name="id"/>
    </join-columns>
    <inverse-join-columns>
    <join-column name="id_servicio" referenced-column-name="id"/>
    </inverse-join-columns>
    </join-table>
    

    和Servicio上的这个

    <doctrine-mapping xmlns="http://doctrine-project.org..." 
      xmlns:xsi="http://www.w3.org/2001/XMLS..." 
      xsi:schemalocation="http://doctrine-project.org... http://doctrine-
      project.org...">
      <entity name="Servicio" table="servicio">
      <indexes>
      <index name="id_categoria" columns="id_categoria"/>
      </indexes>
      <id name="id" type="integer" column="id">
      <generator strategy="IDENTITY"/>
      </id>
       <field name="codigo" type="string" column="codigo" length="15" 
      nullable="false"/>
      <field name="nombre" type="string" column="nombre" length="70" 
      nullable="false"/>
      <field name="detalle" type="string" column="detalle" length="250" 
      nullable="false"/>
      <field name="precioPublico" type="integer" column="precio_publico" 
      nullable="false"/>
     <field name="precioPrivado" type="integer" column="precio_privado" 
      nullable="false"/>
      <field name="medida" type="string" column="medida" length="15" 
      nullable="false"/>
      <field name="planificacion" type="integer" column="planificacion" 
      nullable="false"/>
      <field name="fabricacion" type="integer" column="fabricacion" 
      nullable="false"/>
      <field name="fechaCreacion" type="datetime" column="fecha_creacion" 
      nullable="true"/>
      <field name="ultimaModificacion" type="datetime" column="ultima_modificacion" 
      nullable="false"/>
      <many-to-one field="idCategoria" target-entity="Categoria">
      <join-columns>
      <join-column name="id_categoria" referenced-column-name="id"/>
      </join-columns>
      </many-to-one>
      </entity>
    </doctrine-mapping>
    

    有什么我想念的吗?也许是另一句话要求坚持另一个涉及/相关的课程?

    我正试图通过实体管理器句子中的“solicitud”实体继续...我将它们分隔在不同的层上作为DAO,但它没有问题,当数据到达此层时,我试过var_dump,一切都很好。

    在我的“SolicitudService”中我编写了这个函数来收集持久化所需的所有相关对象,我使用内部函数的VO(虚拟对象)来构建从对象到Json或从Json到Objects和toEntity Pattern的数据(来自VO到所需类的对象)。

    我在这个功能中做了什么:

    1. 首先,我在我的SolicitudServicioVO上找到了我的对象尝试后的以下三个句子,然后我创建了新的对象Solicitud。
    2. 然后我将通过DAO实体创建的对象设置为“Solicitud”新对象(“// set Solicitud Properties”注释后的5行)。
    3. 之后我迭代,($ solicitudServicioVO-&gt; listadoServicio),通过listadoServicio,(来自前端的服务列表),并为每一个创建VO,在下一句话中能够将自己构建为实体“或所需类型的类”,在本例中是我在本问题开头的关系定义中提到的那些。
    4. 我发送坚持这个句子

      $this->solicitudDAO->create($solicitud);
      
    5. 导致有......的DAO

      function create($solicitud){
        $this->em->persist($solicitud);
        $this->em->flush();
        return $solicitud;
      }
      

      这个函数可以通过调用createSolicitud作为其创建一个新的目的来更具描述性,但是没关系......它还必须添加一个与用户相关的Solicitud ..所以我坚持,没关系到现在为止。

      function addSolicitud($solicitudServicioVO){
      try{
        $usuario = $this->usuarioDAO->find($solicitudServicioVO->getIdUsuario()->id);
        $direccion = $this->direccionDAO->find($solicitudServicioVO-
        >getIdDireccion()->id);
        $facturacion = $this->datoFacturacionDAO->find($solicitudServicioVO-
        >getIdFacturacion()->id);
      
        $solicitud = new Solicitud();
      
        //set Solicitud Properties
        $solicitud->setFechaCreacion(new DateTime());
        $solicitud->setEstado("solicitado");
        $solicitud->setIdFacturacion($facturacion);
        $solicitud->setIdDireccion($direccion);
        $solicitud->setIdUsuario($usuario);
      
        foreach($solicitudServicioVO->listadoServicio as $servicioVO)
        { 
          $categoriaServicioVO = $this->categoriaService->getCategoria($servicioVO-
          >getCategoriaId());
          $servicio = $servicioVO->toEntity();
          $servicio->setIdCategoria($categoriaServicioVO->toEntity());
          $solicitud->addServicio($servicio);
        }
      
        $resp = $this->solicitudDAO->create($solicitud);
        $response = Utils::getInstancia()->httpResponseSuccess('001');
        $response['data'] = $resp;
        return $response; 
        }
        catch(Exception $e){
        $response = $e->getMessage();
        }
      }
      

      所以,我是最具描述性的,我不能保持这个关于SOlicitud实体的数据......有人已经有类似的问题或任何额外的想法......可能在XML定义中?,它确实通过实体作为注释,似乎没有任何错误。

      请帮助我,这个多对多的癌症已经用了差不多一个星期没有决议jajaja

1 个答案:

答案 0 :(得分:0)

更新故障状态jaja:

“通过关系'Solicitud#servicios'发现了一个新实体,该关系未配置为实体级联持久化操作:Servicio @ 00000000044008fd0000000000ad7488。要解决此问题:在此未知实体上显式调用EntityManager#persist()或configure cascade在映射中持久保存此关联,例如@ManyToOne(..,cascade = {\“persist \”})。如果找不到哪个实体导致问题实现

有效地,实体Solicitud是一个新的,因为我试图创建它,创建这个新的Solicitud的数据是从前端发送的,我已经从DB中提取的服务......我想即时通讯即将解决它。

你怎么看待这个循环...,我应该要求每个服务的查找,因为我有相应的ID?

    foreach($solicitudServicioVO->listadoServicio as $servicioVO)
    {   
        $categoria = $this->categoriaDAO->find($servicioVO->getCategoriaId());
        //maybe change this next line
        $servicio = $servicioVO->toEntity(); 
        // for this next one?? ill try and tell you...
        $servicio = $this->servicioDAO->find($servicioVO->getId());
        $servicio->setIdCategoria($categoria);
        $solicitud->getServicios();
        $solicitud->addServicio($servicio);

    }

正如我在这里展示的那样,我在$ servicioVO中有服务数据,也许我可以在同一个循环中在DB中找到它。

当我做Solicitud-&gt; addServicio($ servicio),即时添加一个这样的前端服务(servicio),它可以在toEntity模式函数上构建自己作为Servicio类的对象。

所以,我明白该学说可能会抱怨因为它认为添加到arrayCollection的服务与它已经知道的数据库不一样,即使我用它们各自的ID设置它们,导致错误消息指示我更多的是验证服务实体...而不是新的Solicitud。

...我确实以这种方式解决了,我现在正在测试它,并且它工作正常,所以...如果有其他人陷入这个坑,不相信你自己构造的物体jajaja,学说想要它的方式,并且你应该服从,找到或找到通过获取正确的对象而不是构建它们,即使内部数据相同,持久性函数也会混淆,这种情况使用直接查询的数据库对象会更好。