Doctrine2查询交叉表

时间:2014-09-12 05:19:57

标签: php doctrine-orm inner-join

是否有人知道如何让doctrine2对连接的表执行查询,这些表不像交叉表那样存在?我想得到一个用于某个实体的标签列表,这些标签按其使用频率排序(用于自动完成)。我使用相同的标记表来标记不同的实体,每个实体都有一个单独的交叉表。

这个mySQL查询工作正常:

SELECT t.* FROM Tag AS t INNER JOIN ItemXTag AS it ON it.tagId = t.id GROUP BY t.name ORDER BY COUNT(t.name) DESC

但我没有学说执行此查询。我没有ItemXTag的实体,我不需要一个(因为它只是一个只包含关系而没有数据的交叉表)。 我也与Tag实体中的所有其他实体没有任何关系。我只需要其他实体中的标签,我已经定义了像这样的ManyToMany关系:

/**
 * Tags of item
 *
 * var Tag[]
 * @ORM\ManyToMany(targetEntity="Tag", cascade={"persist", "remove"}, orphanRemoval=true)
 * @ORM\JoinTable(name="ItemXTag",
 *      joinColumns={@ORM\JoinColumn(name="itemId", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="tagId", referencedColumnName="id")}
 *  )
 */
protected $tags = array();

如果我创建像

这样的查询方式
$tags = $em->createQuery('SELECT t.* FROM \Application\Entity\Tag AS t INNER JOIN ItemXTag as it WHERE it.tagId = t.id GROUP BY t.name ORDER BY count(t.name) DESC')->getResult();

我从doctrine / orm / lib / Doctrine / ORM / Query / QueryException.php:63收到错误消息“[Semantical Error] line 0,col 49''ItemXTag'附近:错误:类'ItemXTag'是没有定义。“

如果我使用像

这样的查询构建器
$tags = $qb
    ->select('t')
    ->from('\Application\Entity\Tag', 't')
    ->innerJoin('ItemXTag', 'it', 'it.tagId = t.id')
    ->groupBy('t.name')
    ->orderBy('count(t.name)', 'DESC')
    ->getQuery()
    ->getResult();

我得到完全相同的错误。

有人可以帮我解决这个问题吗?

此致 戈登

2 个答案:

答案 0 :(得分:1)

我认为查询中存在轻微错误: 试试这个:

$query = $em->createQuery('SELECT t FROM \Application\Entity\Tag AS t INNER JOIN \Application\Entity\TagItemXTag as it WHERE it.tagId = t.id GROUP BY t.name ORDER BY count(t.name) DESC');
$tags = $query->getResult();

您必须在此处定义实体 TagItemXTag

这可能有用。

答案 1 :(得分:0)

我找到了一个解决方案,使用带有简单结果集映射的本机查询来获取Tag实体。

$rsm = new \Doctrine\ORM\Query\ResultSetMappingBuilder($em);
$rsm->addRootEntityFromClassMetadata('\Application\Entity\Tag', 't');
$tags = $em->createNativeQuery('SELECT t.* FROM Tag AS t INNER JOIN ItemXTag as it ON it.tagId = t.id GROUP BY t.name ORDER BY count(t.name) DESC', $rsm)->getResult();

对我来说很好。