dongzhang1875 2015-01-06 13:55
浏览 65
已采纳

使用Doctrine2删除n:m关系中的'paisesDistribuidorProductoSolicitud'

I have a entity DistribuidorProductoSolicitud with the following code:

/**
 * @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;
     }

    ...
}

How do I delete rows from the relation with $paisesDistribuidorProductoSolicitudPais? I have as parameters the distribuidor_producto_solicitud_id and pais_id.

I'm trying something like this:

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

But I'm unsure it will works, any help or advice?

  • 写回答

1条回答 默认 最新

  • duan20081202 2015-01-06 15:10
    关注

    If you generated the class using the command doctrine:generate:entities, you must have a method called removePaisesDistribuidorProductoSolicitudPais(Pais $paises) or something of the kind. If not, just create it.

    public function removePaisesDistribuidorProductoSolicitudPais(Pais $paises)
    {
      $this->paisesDistribuidorProductoSolicitudPais->removeElement($paises);
    }
    

    With distribuidor_producto_solicitud_id find the object of DistribuidorProductoSolicitud type you want to remove a Pais entity. For instance, from a controller:

    $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();
    

    Find the entity within the ArrayCollection that corresponds to pais_id. You can create a method in your entity to search the array or do it directly in the controller. It's up to you.

    $pais_ent = NULL;
    foreach($distPais->getPaisesDistribuidorProductoSolicitudPais() as $pais) {
     if($pais->getId() == $pais_id) {
      $pais_ent = $pais;
      break;
     }
    }
    

    if $pais_ent is NULL you can throw an exception. I'm going to assume that that case doesn't happen.

    $distPais->removePaisesDistribuidorProductoSolicitudPais($pais_ent);
    $em->flush();
    

    It should have removed the association from the joining table.

    Hope it helps.

    Documentation

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请问如何在openpcdet上对KITTI数据集的测试集进行结果评估?
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错