У меня есть организация DistribuidorProductoSolicitud
со следующим кодом:
/**
* @ORM\Entity
* @ORM\Table(name="negocio.distribuidor_producto_solicitud", schema="negocio")
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\DistribuidorProductoSolicitudRepository")
*/
class DistribuidorProductoSolicitud
{
...
/**
* @ORM\ManyToMany(targetEntity="\AppBundle\Entity\Pais", inversedBy="distribuidorProductoSolicitudPais", cascade={"persist"})
* @ORM\JoinTable(name="nomencladores.pais_distribuidor_producto_solicitud", schema="nomencladores",
* joinColumns={@ORM\JoinColumn(name="distribuidor_producto_solicitud_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="pais_id", referencedColumnName="id")}
* )
*/
protected $paisesDistribuidorProductoSolicitudPais;
public function __construct()
{
$this->paisesDistribuidorProductoSolicitudPais = new ArrayCollection();
}
/**
* Add paisesDistribuidorProductoSolicitudPais
*
* @param AppBundle\Entity\Pais $paises
*/
public function addPaisesDistribuidorProductoSolicitudPais(Pais $paises)
{
$this->paisesDistribuidorProductoSolicitudPais[] = $paises;
}
/**
* Get paisesDistribuidorProductoSolicitudPais
*
* @return Doctrine\Common\Collections\Collection
*/
public function getPaisesDistribuidorProductoSolicitudPais()
{
return $this->paisesDistribuidorProductoSolicitudPais;
}
/**
* Remove paisesDistribuidorProductoSolicitudPais
*
* @param \AppBundle\Entity\DistribuidorProductoSolicitud $distribuidorProductoSolicitud
*/
public function removePaisesDistribuidorProductoSolicitudPais(DistribuidorProductoSolicitud $distribuidorProductoSolicitud)
{
$this->paisesDistribuidorProductoSolicitudPais->removeElement($distribuidorProductoSolicitud);
return $this;
}
...
}
Как удалить строки из отношения с $paisesDistribuidorProductoSolicitudPais
? У меня есть параметры distribuidor_producto_solicitud_id
и pais_id
.
Я пробую что-то вроде этого:
public function getDistribuidorAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$entDistribuidorProductoSolicitud = $em->getRepository('AppBundle:DistribuidorProductoSolicitud')->find($request->query->get('dpsid'));
$response['success'] = false;
$status = null;
if (!$entDistribuidorProductoSolicitud) {
$response['error'] = $this->get('translator')->trans('mensajes.msgNoEncontrado');
return new JsonResponse($response, $status ?: 200);
}
if ($request->isXmlHttpRequest()) {
$entDistribuidorProductoSolicitud->removePaisesDistribuidorProductoSolicitudPais($entDistribuidorProductoSolicitud);
$em->flush();
}
return new JsonResponse($response, $status ?: 200);
}
Но я не уверен, что это будет работать, любая помощь или совет?
Если вы сгенерировали класс, используя команду doctrine:generate:entities
, вы должны иметь метод, называемый removePaisesDistribuidorProductoSolicitudPais(Pais $paises)
или что-то в этом роде. Если нет, просто создайте его.
public function removePaisesDistribuidorProductoSolicitudPais(Pais $paises)
{
$this->paisesDistribuidorProductoSolicitudPais->removeElement($paises);
}
С distribuidor_producto_solicitud_id
найдите объект типа DistribuidorProductoSolicitud
вы хотите удалить объект Pais
. Например, с контроллера:
$distPais = $this->getDoctrine()->getEntityManager()->createQueryBuilder()
->select("s")
->from('MyBundle:DistribuidorProductoSolicitud', 's')
->innerJoin('s.paisesDistribuidorProductoSolicitudPais', 'f')
->where('s.id=:id')
->setParameter('id', $distribuidor_producto_solicitud_id)
->getQuery()
->getSingleResult();
Найдите объект в массиве ArrayCollection, который соответствует pais_id
. Вы можете создать метод в своей сущности для поиска массива или выполнения его непосредственно в контроллере. Это вам.
$pais_ent = NULL;
foreach($distPais->getPaisesDistribuidorProductoSolicitudPais() as $pais) {
if($pais->getId() == $pais_id) {
$pais_ent = $pais;
break;
}
}
если $ pais_ent равен NULL, вы можете создать исключение. Я собираюсь предположить, что этого случая не происходит.
$distPais->removePaisesDistribuidorProductoSolicitudPais($pais_ent);
$em->flush();
Он должен был удалить ассоциацию из таблицы соединения.
Надеюсь, поможет.