Symfony& Doctrine:DQL Max()with groupBy

时间:2016-12-17 10:01:15

标签: sql symfony doctrine dql native-sql

我正在研究Symfony 3.2,我正在尝试做一个“简单”的查询。 这是可以使用的查询的SQL版本(直接在PHPmyAdmin中测试)

SELECT s.*
FROM pl_statsheet s
INNER JOIN (
SELECT day, MAX(points) AS points
FROM pl_statsheet
GROUP BY day
) ps 
ON s.day = ps.day AND s.points = ps.points

不幸的是,我无法“转换”它与Symfony合作。非常感谢一些帮助。这就是我到目前为止所做的。在我的资料库中

$query = $this->getEntityManager()
    ->createQuery(
        'SELECT s
         FROM PlayoffBundle:Statsheet s
         INNER JOIN (
            SELECT day, MAX(points) AS points
            FROM PlayoffBundle:Statsheet
            GROUP BY day
        ) AS ps 
        ON s.day = ps.day AND s.points = ps.points'
     )
     ->getResult();

这就是Error Symfony返回

  

QueryException:[语义错误]第0行,第55行附近'(   SELECT':错误:Class'('未定义。

感谢您的帮助。 我还是Symfony的初学者;)

更新

因为我不能与本机SQL一致。我决定在2个查询中执行此操作。 1 /使用原生SQL,我将获得最大ID(点数) 2 /使用ORM,我只需要执行findById($ arrayIDs)。这样做因为我有ManyToMany关系,而且我更容易获得完整的数据

所以它几乎可以工作,但由于一个我无法解决的原因,我的第二个查询给出了这样的null:

Statsheet {#968 ▼
 -id: 20
 -stats: null
 -points: null
 -day: null
 -player: null
-game: null

}

所以我做了一些测试。我知道ID 20是最大值

例如,这个:

dump($em->getRepository('PlayoffBundle:Statsheet')->find(19));

- >将正确提供所有数据。

dump($em->getRepository('PlayoffBundle:Statsheet')->find(20));

- >将给出我刚刚发布的几行以上的内容(null无处不在于id)

但如果我在NativeSQL之前执行 - > find(20),它会正确地为我提供数据。

我不知道我的解释是否足够清楚。如果需要,我可以提供dump()消息和我的控制器/存储库/实体的代码的屏幕截图。

StatsheetRepository.php

public function getBestPickId()
{

    $sql = 'SELECT s.* FROM pl_statsheet s INNER JOIN ( SELECT day, MAX(points) AS points FROM pl_statsheet GROUP BY day) ps ON s.day = ps.day AND s.points = ps.points';

    $rsm = new ResultSetMapping;
    $rsm->addEntityResult('PlayoffBundle:Statsheet', 's');
    $rsm->addFieldResult('s', 'id', 'id');
    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
    $picks = $query->getResult();

    foreach($picks as $pick){
        $ids[] = $pick->getId();
    }
    return $ids;
}

这是我的控制器

        $bestpicksIds = $em->getRepository('PlayoffBundle:Statsheet')->getBestPickId();
    $bestpicks = $em->getRepository('PlayoffBundle:Statsheet')->findById($bestpicksIds);

    dump($em->getRepository('PlayoffBundle:Statsheet')->find(20));
    dump($em->getRepository('PlayoffBundle:Statsheet')->find(19));
    dump($bestpicks);

所以让我快点解释一下。 ID 19不是最好的选择,但20是。 所以 - > find(19)给出了所需的所有数据 但是 - > find(20)和dump($ bestpicks)只给出了Ids,其余的数据是NULL 以下是我的代码现在所做的事情(也许它有助于理解):Dump Symfony

我知道问题来自本机SQL查询。我不知道它为什么会影响我的下一个查询。那就是我的情况更新。我知道要修复什么,希望我很快就会回来解决这个问题;)

我只是想补充一点,我已经通过添加这些行完成了我的nativeSQL:

    $rsm->addFieldResult('s', 'points', 'points');
    $rsm->addFieldResult('s', 'stats', 'stats');
    $rsm->addFieldResult('s', 'day', 'day');

但到目前为止,这似乎并不适用于游戏这样的外键 $ rsm-> addMetaResult('s','game_id','game');

仍在努力。

1 个答案:

答案 0 :(得分:0)

这种查询在DQL中不起作用。

您有几个选择:

a)使用Doctrine DBAL代替ORM。 DBAL与使用mysql预处理语句几乎相同。结果出现在数组中,而不是像ORM一样出现在对象中。

b)使用Native SQL,您必须定义将手动填充的实体和属性。