【问题标题】:How can I do a manyTomany query with Doctrine in Symfony2如何在 Symfony2 中使用 Doctrine 进行 manyTomany 查询
【发布时间】:2015-01-05 11:29:02
【问题描述】:

我想知道有多少“朋友”有一个“坎帕纳”

查询必须是怎样的?

我的课程是:

<?php


namespace Axonsystem\Bundles\CampanaBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="afiliado")
 */
class Afiliado
{

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255,nullable=true)
 */
private $name;


/**
 * @ORM\ManyToMany(targetEntity="Campana", inversedBy="afiliados")
 * @ORM\JoinTable(name="afiliado_campana")
 *
 */
protected $campanas;


..........

/**
 * @ORM\Entity
 * @ORM\Table(name="campana")
 */
class Campana {


/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;


/**
 * @ORM\ManyToMany(targetEntity="Afiliado", mappedBy="campanas",cascade={"persist"})
 *
 */
protected $afiliados;


..............

我去掉了 setter 和 getter 以及一些属性,这样内容显示更容易。

【问题讨论】:

  • 您的问题是语法和数据库控制器还是 SQL 本身?

标签: php symfony orm doctrine-orm doctrine


【解决方案1】:

您需要使用 QueryBuilder 来执行此查询。我建议为 Entity Afiliado 创建一个存储库,并在抄写员中这样写:

<?php

namespace Axonsystem\Bundles\CampanaBundle\Entity\Repository;

use Doctrine\ORM\EntityRepository;

class AfiliadoRepository extends EntityRepository
{
    public function countByCampana($campanaId) {
        return $this->getEntityManager()->createQueryBuilder()
            ->select('COUNT(a.id)')
            ->from('CampanaBundle:Afiliado', 'a')
            ->innerJoin('CampanaBundle:Campana', 'c', 'WITH', 'c.id = a.campanas')
            ->where('c.id = :campanaId')
            ->setParameter('campanaId', $campanaId)
            ->getQuery()
            ->getSingleScalarResult();
    }
}

【讨论】:

  • 非常感谢您的支持。我要试试这个。我认为它会起作用!
【解决方案2】:

使用查询生成器,我认为可以这样做:

$qb->select("COUNT(f) as num_afiliados")
    ->from('CampanaBundle\Entity\Campana', 's')
    ->innerJoin('s.afiliados', 'f')
    ->where('s.id=:id')
    ->setParameter('id',$id);

$id 包含您要查找好友数量的campana 的id。

更新

如果您想检索朋友的名称

$qb->select("f.name")
        ->from('CampanaBundle\Entity\Campana', 's')
        ->innerJoin('s.afiliados', 'f')
        ->where('s.id=:id')
        ->setParameter('id',$id);

如果您正在使用 Symfony,只需调整查询即可。假设你在一个控制器中:

$ret = $this->getDoctrine()->getEntityManager()->createQueryBuilder()
                ->select("f.name")
                ->from('CampanaBundle:Campana', 's')
                ->innerJoin('s.afiliados', 'f')
                ->where('s.id=:id')
                ->setParameter('id', $id)
                ->getQuery()
                ->getResult();

【讨论】:

  • 现在,如果我想知道加盟商的名字,我应该如何查询?
  • @user3690919 不客气 :) 如果有效,请接受答案
猜你喜欢
  • 2016-06-06
  • 1970-01-01
  • 2015-06-10
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多