完全描述的关系应该是......
我确实从我的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到所需类的对象)。
我在这个功能中做了什么:
我发送坚持这个句子
$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
答案 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,学说想要它的方式,并且你应该服从,找到或找到通过获取正确的对象而不是构建它们,即使内部数据相同,持久性函数也会混淆,这种情况使用直接查询的数据库对象会更好。