Доктрина 2.4 не может сохраняться / вставлять многие во многие объекты ассоциации

люди, вы можете мне помочь? У меня возникают проблемы с сохранением сущности (Solicitud) в Doctrine 2.4, у сущности все связанные с ней объекты уже хранятся в ее свойствах, когда я передаю объект менеджеру сущностей для сохранения и сброса.

Полностью описанные отношения должны быть …

  1. Usuario-> Осторожности (один ко многим)
  2. Solicitud-> Servicios (многие ко многим)
  3. Категория-> 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 (из VO в Object нужного класса).

что я делаю в этой функции:

  1. Сначала я нахожу объекты, которые у меня есть в моем SolicitudServicioVO. В следующих трех предложениях после попытки я создаю новый объект Solicitud.
  2. Затем я устанавливаю объекты, созданные с помощью сущностей DAO, в новый объект «Solicitud» (через 5 строк после комментария «// set Solicitud Properties»).
  3. После этого я повторяю ($ solicitudServicioVO-> listadoServicio) через 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

0

Решение

Обновление статуса неисправности

«Новый объект был найден с помощью отношения« 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.

…я решил это, я сейчас проверяю это, и оно работает нормально, так что … если кто-то еще упадет в эту яму, не доверяйте своим собственным построенным объектам jajaja, доктрина хочет этого, и вы должны подчиняться, делать найти или найти, чтобы получить правильные объекты вместо того, чтобы строить их, даже если данные внутри одинаковы, функция persist запуталась, в этой ситуации лучше использовать объекты db с прямым запросом.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]