Удалите строку из связанной сущности во многих отношениях со многими в 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Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ: найти лучший подход

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

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;
}

}

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

1

Решение

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

Во-первых, получить все $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')

1

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

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

В вашем контроллере действие 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;

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

Я хотел бы получить лучший ответ от других пользователей.

0

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