Доктрина 2.4 не может сохраняться / вставлять многие во многие объекты ассоциации
Люди, вы можете мне помочь? У меня возникают проблемы с сохранением сущности (Solicitud) в Doctrine 2.4, у сущности все связанные с ней объекты уже хранятся в ее свойствах, когда я передаю объект менеджеру сущностей для сохранения и сброса.
Полностью описанные отношения должны быть...
- Usuario-> Осторожности (один ко многим)
- Solicitud-> Servicios (многие ко многим)
- Категория-> Servicios (один ко многим)
Я сгенерировал сущности и структуру БД из моего 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 в Object нужного класса).
что я делаю в этой функции:
- Сначала я нахожу объекты, которые у меня есть в моем SolicitudServicioVO. В следующих трех предложениях после попытки я создаю новый объект Solicitud.
- Затем я устанавливаю объекты, созданные с помощью сущностей DAO, в новый объект "Solicitud" (через 5 строк после комментария "//set Solicitud Properties").
- После этого я повторяю ($solicitudServicioVO->listadoServicio) через listadoServicio (список сервисов, поступающих из внешнего интерфейса) и создаю 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
1 ответ
Обновление статуса неисправности
"Новый объект был найден через отношение" Solicitud#servicios ", которое не было настроено для каскадного сохранения операций для объекта: Servicio@00000000044008fd0000000000ad7488. Чтобы решить эту проблему: либо явным образом вызовите EntityManager#persist() для этого неизвестного объекта, либо настройте каскадное сохранение эта связь в сопоставлении, например, @ManyToOne(..,cascade={\"persist\"}). Если вы не можете выяснить, какая сущность вызывает проблему, реализуйте
по сути, объект Solicitud является новым, потому что я пытаюсь его создать, данные для создания этого нового Solicitud отправляются из внешнего интерфейса с сервисами, которые я уже извлек из DB... я думаю, что я собираюсь решить Это.
Что вы думаете об этом цикле..., я должен просить найти для каждой службы, так как у меня есть соответствующий идентификатор?
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), я добавляю одну из этих отправленных служб внешнего интерфейса (servicio), которые могут конструировать себя как объект класса Servicio, в функции шаблона toEntity.
Итак, я понимаю, что доктрина может жаловаться, потому что она думает, что сервисы, добавленные в arrayCollection, не совпадают с тем, что он уже знает из своей БД, хотя я устанавливаю их с соответствующим ID, потому что сообщение об ошибке направляет меня больше для проверки обслуживающий объект... чем новый Solicitud.
... я решил эту проблему, сейчас я проверяю ее, и она отлично работает, так что... если кто-то еще упадет в эту яму, не доверяйте своим собственным построенным объектам, джаджая, доктрина хочет этого, и вы должны подчиняйся, найди или найди, чтобы получить нужные объекты вместо того, чтобы строить их, даже если данные внутри одинаковы, функция persist запуталась, в этой ситуации лучше использовать объекты db с прямым запросом.