在Symfony2和Doctrine中,我想执行一个返回计数和分组依据的查询。
这是我尝试过的。这是我要运行的SQL:
SELECT `terrain_id` , COUNT( * ) FROM `Partie` WHERE 1 =1 GROUP BY `terrain_id`
与我的实体:
class Partie { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\ManyToOne(targetEntity="Gp\UserBundle\Entity\User", inversedBy="parties", cascade={"persist"}) * @ORM\JoinColumn(nullable=false) */ private $user; /** * @ORM\ManyToOne(targetEntity="Gp\JeuxBundle\Entity\Terrain") */ private $terrain;
这是我的PartieRepository
public function getTest(\Gp\UserBundle\Entity\User $user){ return $this->createQueryBuilder('p') ->select('count(p), p.terrain') ->where('p.user = :user') ->setParameter('user', $user) ->groupBy('r.terrain') ->getQuery() ->getResult(); }
这是我得到的错误:
[Semantical Error] line 0, col 19 near 'terrain FROM': Error: Invalid PathExpression. Must be a StateFieldPathExpression.
您可能要使用本机查询
$sql = "SELECT terrain_id as terrain, count(*) AS count " ."FROM Partie " ."GROUP BY terrain_id;"; $rsm = new ResultSetMapping; $rsm->addScalarResult('terrain', 'terrain'); $rsm->addScalarResult('count', 'count'); $query = $this->_em->createNativeQuery($sql, $rsm); return $query->getResult();
只需根据需要添加任何具有/ where子句。
以下是我的结果:
Array ( [0] => Array ( [terrain] => [count] => 7 ) [1] => Array ( [terrain] => 1 [count] => 5 ) [2] => Array ( [terrain] => 2 [count] => 1 ) )
第terrain一个数组中缺少的原因是null terrain_id。
terrain
terrain_id
编辑
OP产生了意外的结果,因此这是一些故障排除步骤:
1)在语句 前* 尝试var_dump($query->getSQL());正确的操作,然后直接对您的数据库运行SQL。如果这产生不正确的结果,请检查查询并适当更改。 *return``$sql
var_dump($query->getSQL());
return``$sql
2)如果#1产生正确的结果,请在return语句 之前* 尝试var_dump($query->getResult());右移。如果这产生正确的结果,则说明您的代码中有更深层的内容。现在该看看为什么被过滤了。它可能与删除和更改SQL和中的别名一样简单。 *terrain``addScalarResult
var_dump($query->getResult());
terrain``addScalarResult
3)尝试一个更简单的功能:
$sql = "SELECT distinct(terrain_id) FROM Partie;"; $rsm = new ResultSetMapping; $rsm->addScalarResult('terrain_id', 'terrain_id'); $query = $this->_em->createNativeQuery($sql, $rsm); var_dump($query->getSQL()); var_dump($query->getResult()); return $query->getResult();