Удалите 'paisesDistribuidorProductoSolicitud' для отношения n: m, используя Doctrine2

0

У меня есть организация 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
doctrine2

1 ответ

1
Лучший ответ

Если вы сгенерировали класс, используя команду 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();

Он должен был удалить ассоциацию из таблицы соединения.

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

Документация

Ещё вопросы

Сообщество Overcoder
Наверх
Меню