小编典典

symfony2-主义-如何使用计数和分组依据进行多重选择

sql

在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.

阅读 185

收藏
2021-04-22

共1个答案

小编典典

您可能要使用本机查询

$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

编辑

OP产生了意外的结果,因此这是一些故障排除步骤:

1)在语句 前*
尝试var_dump($query->getSQL());正确的操作,然后直接对您的数据库运行SQL。如果这产生不正确的结果,请检查查询并适当更改。
*return``$sql

2)如果#1产生正确的结果,请在return语句 之前*
尝试var_dump($query->getResult());右移。如果这产生正确的结果,则说明您的代码中有更深层的内容。现在该看看为什么被过滤了。它可能与删除和更改SQL和中的别名一样简单。
*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();
2021-04-22