Удалить строку из связанного объекта во многих отношениях во многих отношениях в Doctrine2

У меня есть это лицо:

class FabricanteProductoSolicitud { use IdentifierAutogeneratedEntityTrait; /** * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\FabricanteDistribuidor") * @ORM\JoinColumn(name="fabricante_distribuidor_id", referencedColumnName="id") */ protected $fabricante_distribuidor; /** * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\ProductoSolicitud") * @ORM\JoinColumn(name="producto_solicitud_id", referencedColumnName="id") */ protected $producto_solicitud; /** * @ORM\ManyToMany(targetEntity="\AppBundle\Entity\Pais", inversedBy="fabricanteProductoSolicitudPais", cascade={"persist"}) * @ORM\JoinTable(name="nomencladores.pais_fabricante_producto_solicitud", schema="nomencladores", * joinColumns={@ORM\JoinColumn(name="fabricante_producto_solicitud_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="pais_id", referencedColumnName="id")} * ) */ protected $paisesFabricanteProductoSolicitudPais; /** * @ORM\ManyToMany(targetEntity="\AppBundle\Entity\ModeloMarcaProducto", inversedBy="modeloMarcaProducto", cascade={"persist"}) * @ORM\JoinTable(name="negocio.fabricante_modelo_marca_producto", schema="negocio", * joinColumns={@ORM\JoinColumn(name="fabricante_producto_solicitud_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="modelo_marca_producto_id", referencedColumnName="id")} * ) */ protected $modeloMarcaProducto; public function __construct() { $this->paisesFabricanteProductoSolicitudPais = new ArrayCollection(); $this->modeloMarcaProducto = new ArrayCollection(); } public function addModeloMarcaProducto(ModeloMarcaProducto $modeloMarcaProducto) { $this->modeloMarcaProducto[] = $modeloMarcaProducto; } public function removeModeloMarcaProducto(ModeloMarcaProducto $modeloMarcaProducto) { $this->modeloMarcaProducto->removeElement($modeloMarcaProducto); return $this; } public function getModeloMarcaProducto() { return $this->modeloMarcaProducto; } } 

Через Ajax я сделал запрос к методу, который обрабатывал несколько значений:

 foreach ($request->request->get('items') as $item) { // delete row if it can be deleted } 

В приведенном выше коде $item['value'] содержит значения negocio.fabricante_modelo_marca_producto.fabricante_producto_solicitud_id , идея состоит в том, чтобы удалить каждую строку из связанной таблицы ( fabricante_modelo_marca_producto ), предоставив fabricante_producto_solicitud_id , может ли кто-нибудь мне помочь?

EDIT: найдите лучший подход

Пытаясь найти лучший подход, я сделал этот кусок кода:

 foreach ($request->request->get( 'items' ) as $item) { $relacion = $this->get( 'database_connection' )->fetchColumn( 'SELECT COUNT(fabricante_producto_solicitud_id) AS cnt FROM negocio.fabricante_modelo_marca_producto WHERE fabricante_producto_solicitud_id = ?', array( $item['value'] ) ); if ($relacion === 0) { $entFabricanteProductoSolicitud = $em->getRepository( "AppBundle:FabricanteProductoSolicitud" )->find( $item['value'] ); try { $em->remove( $entFabricanteProductoSolicitud ); $em->flush(); array_push( $itemsRemoved, $item['value'] ); $response['success'] = true; $status = 200; } catch ( \Exception $e ) { $status = 400; dump( $e->getMessage() ); return new JsonResponse( $response, $status ?: 200 ); } } $response['itemsRemoved'] = $itemsRemoved; } 

}

Возможно, у него есть некоторые проблемы, так как я пишу еще, и это не проверено, но таким образом я могу узнать, какой элемент удален, а что нет, не так ли? Правильно ли это?

Я бы сделал это так:

Сначала извлеките все $fabricanteProductoSolicitud используя соединение, чтобы получить их $modeloMarcaProducto в одном запросе:

Во-вторых, пройдите результат и очистите $modeloMarcaProducto сохраняя $fabricanteProductoSolicitud (это не переведено в доступ к БД, просто отмечает сущности, удаленные для Doctrine).

В-третьих, отправьте изменения в БД с помощью flush :

  $em = $this->getDoctrine()->getEntityManager(); $qb = $em->createQueryBuilder(); $ret = $qb ->select("u") ->from('MyBundle:FabricanteProductoSolicitud', 'u') ->join("u.modeloMarcaProducto","f") ->add('where', $qb->expr()->in('u.id', ':ids')) ->setParameter('ids',$request->request->get('items')) ->getQuery() ->getResult(); foreach($ret as $fabricantePS) { $fabricantePS->getModeloMarcaProducto()->clear(); $em->persist($fabricantePS); } $em->flush(); 

Это должно удалить все сущности из объединенной таблицы с помощью fabricante_producto_solicitud_id в $request->request->get('items')

Вы можете сделать это таким образом,

В действии ajax вашего контроллера:

  foreach ($request->request->get('items') as $item) { $em = $this->getDoctrine()->getManager(); $fabricanteProductoSolicitud = $em->getRepository('YourBundle:FabricanteProductoSolicitud')->find($item['value']); $modeloMarcaProductos = $fabricanteProductoSolicitud->getModeloMarcaProducto(); foreach($modeloMarcaProductos as $modeloMarcaProducto) { //echo $modeloMarcaProducto->getId(); $fabricanteProductoSolicitud->removeModeloMarcaProducto($modeloMarcaProducto); $em->flush(); } } } // return response; or exit; 

Надеюсь, эта помощь тебе поможет.

Интересно, для лучшего ответа от других пользователей.