是否有人知道如何让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();
我得到完全相同的错误。
有人可以帮我解决这个问题吗?
此致 戈登
答案 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();
对我来说很好。