adr*_*_om 5 sql symfony doctrine-orm
在Symfony2和Doctrine中,我想执行一个返回count和group by的查询.
这是我尝试过的.这是我想要运行的SQL:
SELECT `terrain_id` , COUNT( * )
FROM `Partie`
WHERE 1 =1
GROUP BY `terrain_id`
Run Code Online (Sandbox Code Playgroud)
我的实体:
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;
Run Code Online (Sandbox Code Playgroud)
这是我的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();
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
[Semantical Error] line 0, col 19 near 'terrain FROM': Error:
Invalid PathExpression. Must be a StateFieldPathExpression.
Run Code Online (Sandbox Code Playgroud)
您可能要使用本机查询
$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();
Run Code Online (Sandbox Code Playgroud)
只需根据需要添加任何具有/ where子句。
以下是我的结果:
Array
(
[0] => Array
(
[terrain] =>
[count] => 7
)
[1] => Array
(
[terrain] => 1
[count] => 5
)
[2] => Array
(
[terrain] => 2
[count] => 1
)
)
Run Code Online (Sandbox Code Playgroud)
第terrain一个数组中缺少的原因是null terrain_id。
编辑
OP产生了意外的结果,因此这是一些故障排除步骤:
1)在语句之前尝试var_dump($query->getSQL());正确的操作,然后直接对您的数据库运行SQL。如果这产生不正确的结果,请检查查询并适当更改。return$sql
2)如果#1产生正确的结果,请在return语句之前尝试var_dump($query->getResult());右移。如果这产生正确的结果,则说明您的代码中有更深层的内容。现在该看看为什么被过滤了。它可能与删除和更改SQL和中的别名一样简单。terrainaddScalarResult
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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20474 次 |
| 最近记录: |