5

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

3 回答 3

5

您可能想要使用本机查询

$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();

只需根据需要添加任何 have / 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 产生正确的结果,var_dump($query->getResult());请在 return 语句之前尝试。如果这产生了正确的结果,那么你的代码中就会发生更深层次的事情。是时候看看为什么terrain被过滤了。它可能就像删除或更改 SQL 和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();
于 2013-09-25T19:57:36.937 回答
1

此错误发生在此行:select('count(p), p.terrain')您尝试使用p不再存在的别名。该select方法覆盖createQueryBuilder(). 为避免这种情况,addSelect请改用或明确指定from方法。尝试这个 :

public function getTest(\Gp\UserBundle\Entity\User $user){
return $this->createQueryBuilder('p')
->addSelect('count(p), p.terrain')
->where('p.user = :user')
->setParameter('user', $user)
->groupBy('r.terrain')
->getQuery()
->getResult();

}

或这个 :

public function getTest(\Gp\UserBundle\Entity\User $user){
return $this->createQueryBuilder('p')
->select('count(p), p.terrain')
->from('YourBundle:YourEntity', 'p')
->where('p.user = :user')
->setParameter('user', $user)
->groupBy('r.terrain')
->getQuery()
->getResult();
}
于 2013-09-24T23:49:33.437 回答
0

如何使用计数和分组执行原始查询:

连接到您的经理并建立新的连接:

$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();

创建您的查询并 fetchAll:

$result= $conn->query(
'select count(p.id) foobar, p.myid from foobartable p group by p.myid'
)->fetchAll();

从结果中获取数据,如下所示:

$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
于 2014-02-14T17:57:27.407 回答