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

此代码有效并在数据库中创建了 table info_champion

我只想 select 包含与某些特定冠军使用学说 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();