0

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

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

  1. Usuario-> 关怀(一对多)
  2. Solicitud-> Servicios(多对多)
  3. 类别->服务(一对多)

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

在我的“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 模式的数据(从 VO 到 Object所需的类)。

我在这个函数中做什么:

  1. 首先我在我的SolicitudServicioVO上找到我有的对象下面三句话尝试后,然后我创建了新的对象Solicitud。
  2. 然后我将通过 DAO 实体创建的对象设置为“Solicitud”新对象(“//set Solicitud Properties”注释后的 5 行)。
  3. 之后,我通过 listadoServicio 迭代($solicitudServicioVO->listadoServicio)(来自前端的服务列表),并为每个服务创建 VO,它们能够在接下来的句子中将自己构建为一个实体“或所需类型的类”,在这种情况下,是我在本问题开头的关系定义中提到的那些。
  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

4

1 回答 1

0

更新故障状态jaja:

“通过关系‘Solicitud#servicios’找到了一个新实体,该实体未配置为对实体进行级联持久化操作:Servicio@00000000044008fd0000000000ad7488。解决此问题:在此未知实体上显式调用 EntityManager#persist() 或配置级联持久性映射中的这种关联,例如 @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 中有服务数据,也许我可以在数据库中找到它,在同一个循环中。

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

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

...我确实以这种方式解决了,我现在正在测试它,它工作正常,所以...如果其他人掉进这个坑,不要相信你自己构造的对象 jajaja,教义想要它的方式,你应该服从,做 find 或 find by 来获取正确的对象而不是构建它们,即使里面的数据相同,persist 函数也会混淆,这种情况最好使用直接查询的 db 对象。

于 2018-02-21T20:52:10.357 回答