使用原则2删除n:m关系上的“paisesDistribuidorProductoSolicitud”


Remove 'paisesDistribuidorProductoSolicitud' on n:m relation using Doctrine2

我有一个带有以下代码的实体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_idpais_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查找要删除Pais实体DistribuidorProductoSolicitud类型的对象。例如,从控制器:

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

它应该已从联接表中删除关联。

希望对您有所帮助。

文档