Doctrine 2.4 不能 persist/insert 多对多关联实体

Doctrine 2.4 can't persist/insert many to many association entities

大家能帮帮我吗?我在 Doctrine 2.4 上持久化实体 (Solicitud) 时遇到麻烦,当我将对象传递给实体管理器以进行持久化和刷新时,该实体的所有关联对象都已存储在其属性中。

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

  1. Usuario-> Solicitudes(一对多)
  2. 请求-> 服务(多对多)
  3. 类别->服务(一对多)

我确实从我的 XML 映射中生成了实体和数据库结构...

在我的 "solicitud" XML 上,我已经定义了关系,如下所示...当我执行命令时,中间 table 得到有效创建:

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>

有什么我想念的吗?也许另一个句子呼吁坚持另一个 classes involved/related?

我试图通过实体管理器语句中的 "solicitud" 实体来坚持...我将它们与 DAO 分开在不同的层上,但是当数据到达这里时,这没问题层,我试了 var_dump ,一切正常。

在我的 "SolicitudService" 中,我编写了这个函数来收集持久化所需的所有相关对象,我使用 VO(虚拟对象)和内部函数来构建从对象到 Json 或从Json to Objects and toEntity Pattern(from VO to Object of the needed class).

我在这个函数中做了什么:

  1. 首先我找到了我在我的SolicitudServicioVO上的对象尝试了以下三句话,然后我创建了新对象Solicitud。
  2. 然后我将通过 DAO 实体创建的对象设置为 "Solicitud" 新对象(“//set Solicitud Properties”注释后 5 行)。
  3. 之后我迭代,($solicitudServicioVO->listadoServicio),通过 listadoServicio ,(来自前端的服务列表),并为每个服务创建 VO,它们能够在接下来的句子中构建自己作为一个实体"or class of the needed type",在本例中是我在这个问题开头的关系定义中提到的实体。
  4. 我发来坚持,就这句话

    $this->solicitudDAO->create($solicitud);
    

导致 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

正在更新故障状态 jaja:

"A new entity was found through the relationship 'Solicitud#servicios' that was not configured to cascade persist operations for entity: Servicio@00000000044008fd0000000000ad7488. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={\"坚持\"})。如果您无法找出导致问题的实体,请实施

实际上,实体 Solicitud 是一个新实体,因为我正在尝试创建它,创建这个新 Solicitud 的数据是从 front-end 发送的,其中包含我已经从数据库中提取的服务。 .我想我要解决它了。

您如何看待这个循环...,我是否应该为每项服务请求查找,因为我有各自的 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 中有服务数据,也许我可以在同一个循环中的数据库中找到它。

当我执行 Solicitud-> addServicio($servicio) 时,我添加了一个 fron-end 发送的服务,(servicio),它可以将自己构造为 Servicio class 的对象,在一个 toEntity 模式函数。

所以,我知道 doctrine 可能会抱怨,因为它认为添加到 arrayCollection 的服务与它已经从其数据库中知道的服务不同,即使我用各自的 ID 设置它们,也会导致错误消息指导我更多地验证服务实体...而不是新的 Solicitud。

...我确实是这样解决的,我现在正在测试它,它工作正常,所以...如果其他人掉进这个坑,不要相信你自己构造的对象 jajaja,学说要他们的方法,你应该服从,通过查找或查找来获取正确的对象而不是构建它们,即使内部数据相同,持久化功能也会混淆,这种情况最好使用直接查询的数据库对象。