使用具有ZF2和Doctrine中的多对多关系的QueryBuilder创建查询


Create a Query using QueryBuilder with a Many-to-Many relation in ZF2 and Doctrine

用户信息:

namespace Module'Entity;
use Doctrine'ORM'Mapping as ORM;
use Zend'Stdlib'Hydrator;
/**
 * Info
 *
 * @ORM'Table(name="user_info")
 * @ORM'Entity
 * @ORM'HasLifecycleCallbacks
 * @ORM'Entity(repositoryClass="Module'Entity'InfoRepository")
 */
class Info
{
    /**
     * @var ArrayCollection $champions
     *
     * @ORM'ManyToMany(targetEntity="Module'Entity'Champion", inversedBy="infos")
     */
    private $champions;
}

冠军:

namespace Module'Entity;
use Doctrine'ORM'Mapping as ORM;
use Zend'Stdlib'Hydrator;
/**
 * Champion
 *
 * @ORM'Table(name="champion")
 * @ORM'Entity
 * @ORM'HasLifecycleCallbacks
 * @ORM'Entity(repositoryClass="Module'Entity'ChampionRepository")
 */
class Champion
{
    /**
     * @var ArrayCollection $infos
     *
     * @ORM'ManyToMany(targetEntity="Module'Entity'Info", mappedBy="champions")
     */
    private $infos;
}

此代码工作正常,并在数据库中创建了一个表info_champion

我只想使用原则QueryBuilder选择包含与某个特定冠军关系的信息,比如下面的SQL查询:

SELECT i.* FROM `user_info` AS i 
  LEFT JOIN info_champion ic ON ic.info_id = i.id 
  WHERE ic.champion_id = 2;

在您的用户信息存储库中:

$queryBuilder = $this->createQueryBuilder('i')
    ->addSelect('ic') //only needed if you want to fetch join...
    ->innerJoin('i.champions', 'ic')
    ->where('ic.id = :champion_id')
    ->setParameter('champion_id', 2);
$query = $queryBuilder->getQuery();
return $query->getResult();