Symfony 条令-如何获取按相关实体计数排序的实体(一对多)?
我试图检索按评论数量排序的最活跃的用户 此DQL查询返回一个对象Symfony 条令-如何获取按相关实体计数排序的实体(一对多)?,symfony,doctrine-orm,dql,Symfony,Doctrine Orm,Dql,我试图检索按评论数量排序的最活跃的用户 此DQL查询返回一个对象 $query = $this->_em->createQuery( 'select u, COUNT(q) qc FROM Btp\UserBundle\Entity\User u JOIN u.questions q ORDER BY qc' ) ->setMaxResults($limit)
$query = $this->_em->createQuery(
'select u, COUNT(q) qc
FROM Btp\UserBundle\Entity\User u
JOIN u.questions q
ORDER BY qc'
)
->setMaxResults($limit)
->getResult();
... while this query returns two objects as expected.
$query = $this->_em->createQuery(
'select u
FROM Btp\UserBundle\Entity\User u
JOIN u.questions q'
)
->setMaxResults($limit)
->getResult();
我如何解决这个问题
编辑2:
好的,我想我不远了。为此:
$rsm = new ResultSetMapping;
$rsm->addEntityResult('Btp\UserBundle\Entity\User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'name', 'name');
$rsm->addJoinedEntityResult('Btp\UserBundle\Entity\Question' , 'q', 'u', 'questions');
$rsm->addFieldResult('q', 'question_id', 'id');
$rsm->addScalarResult('nb_questions', 'nbQuestions');
$sql = 'SELECT u.id, u.name, COUNT(q.id) as nb_questions
FROM user AS u
INNER JOIN question AS q ON u.id = q.auteur_id
GROUP BY u.id
ORDER BY nb_questions ASC';
$query = $this->_em->createNativeQuery($sql, $rsm);
return ($query->getResult());
我检索了两个用户对象,但我不明白如何为每个用户访问COUNT()结果
编辑:
我查看了NativeQuery,这似乎是可能的,但我不明白为什么它不起作用:
$rsm = new ResultSetMapping;
$rsm->addEntityResult('User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'name', 'name');
$rsm->addJoinedEntityResult('Question' , 'q', 'u', 'questions');
$rsm->addFieldResult('q', 'question_id', 'id');
$rsm->addScalarResult('nb_questions', 'nbQuestions');
$sql = 'SELECT u.id, u.name, COUNT(q.id) as nb_questions
FROM user AS u
INNER JOIN question AS q ON u.id = q.auteur_id
GROUP BY u.id
ORDER BY nb_questions ASC';
$query = $this->_em->createNativeQuery($sql, $rsm);
这只返回一个对象
但我希望每个用户都有一个对象,可能的话,每个用户都有一个“抽象属性”(我只是发明了这个世界,而不是用谷歌搜索它…),并回答他们的问题
我不知道我是否真的很清楚
谢谢再次阅读Dotrine文档后,我找到了一个解决方案。就像我的第二次编辑一样,您只需要创建一个ScalarField。我给你举个例子
$rsm = new ResultSetMapping;
$rsm->addEntityResult('Btp\UserBundle\Entity\User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'name', 'name');
$rsm->addJoinedEntityResult('Btp\UserBundle\Entity\Question' , 'q', 'u', 'questions');
$rsm->addFieldResult('q', 'question_id', 'id');
$rsm->addScalarResult('nb_questions', 'nbQuestions');
$sql = 'SELECT u.id, u.name, COUNT(q.id) as nb_questions
FROM user AS u
INNER JOIN question AS q ON u.id = q.auteur_id
GROUP BY u.id
ORDER BY nb_questions ASC';
$query = $this->_em->createNativeQuery($sql, $rsm);
return ($query->getResult());
在本例中,条令返回一个用户数组,您可以通过以下方式访问它们:
(我们假设$askers具有下面代码的返回结果)
如果需要ScalarField,请在返回数组中设置一个新字段,以便:
$askers[0][“nbQuestions”]//给出ScalarField的结果,在本例中是数组的第一个用户的
问题编号
谢谢,希望能对你有所帮助 您的第一个查询按u进行隐式
分组,因此我希望第二个查询的两个结果u
是相同的。因此。。。在一个DQL请求中做我想做的是不可能的?我想你需要将它更改为选择u,计数(不同的(q))qc
好的,泰,我明天在工作中测试它,我告诉你它是否有效:)呼。。。我很失望。。。这给出了一个错误:[语法错误]第0行,第25列:错误:预期的条令\ORM\Query\Lexer::T\u CLOSE\u括号,得到了“q”。还有别的想法吗?
$askers->[0][0]->getName() //return the name of the first User in array