Doctrine 2.4 不能 persist/insert 多对多关联实体
Doctrine 2.4 can't persist/insert many to many association entities
大家能帮帮我吗?我在 Doctrine 2.4 上持久化实体 (Solicitud) 时遇到麻烦,当我将对象传递给实体管理器以进行持久化和刷新时,该实体的所有关联对象都已存储在其属性中。
完整描述的关系应该是...
- Usuario-> Solicitudes(一对多)
- 请求-> 服务(多对多)
- 类别->服务(一对多)
我确实从我的 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).
我在这个函数中做了什么:
- 首先我找到了我在我的SolicitudServicioVO上的对象尝试了以下三句话,然后我创建了新对象Solicitud。
- 然后我将通过 DAO 实体创建的对象设置为 "Solicitud" 新对象(“//set Solicitud Properties”注释后 5 行)。
- 之后我迭代,($solicitudServicioVO->listadoServicio),通过 listadoServicio ,(来自前端的服务列表),并为每个服务创建 VO,它们能够在接下来的句子中构建自己作为一个实体"or class of the needed type",在本例中是我在这个问题开头的关系定义中提到的实体。
我发来坚持,就这句话
$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,学说要他们的方法,你应该服从,通过查找或查找来获取正确的对象而不是构建它们,即使内部数据相同,持久化功能也会混淆,这种情况最好使用直接查询的数据库对象。
大家能帮帮我吗?我在 Doctrine 2.4 上持久化实体 (Solicitud) 时遇到麻烦,当我将对象传递给实体管理器以进行持久化和刷新时,该实体的所有关联对象都已存储在其属性中。
完整描述的关系应该是...
- Usuario-> Solicitudes(一对多)
- 请求-> 服务(多对多)
- 类别->服务(一对多)
我确实从我的 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).
我在这个函数中做了什么:
- 首先我找到了我在我的SolicitudServicioVO上的对象尝试了以下三句话,然后我创建了新对象Solicitud。
- 然后我将通过 DAO 实体创建的对象设置为 "Solicitud" 新对象(“//set Solicitud Properties”注释后 5 行)。
- 之后我迭代,($solicitudServicioVO->listadoServicio),通过 listadoServicio ,(来自前端的服务列表),并为每个服务创建 VO,它们能够在接下来的句子中构建自己作为一个实体"or class of the needed type",在本例中是我在这个问题开头的关系定义中提到的实体。
我发来坚持,就这句话
$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,学说要他们的方法,你应该服从,通过查找或查找来获取正确的对象而不是构建它们,即使内部数据相同,持久化功能也会混淆,这种情况最好使用直接查询的数据库对象。