1

我正在研究 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();

这是错误 Symfony 返回

QueryException: [Semantical Error] line 0, col 55 near '( SELECT': Error: Class '(' is not defined。

谢谢你的帮助。我仍然是 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));

--> 将给出我刚刚在上面发布的几行内容(除 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) 只给出了 Id,其余数据为 NULL 这是我的代码现在所做的(也许是'会帮助理解):转储 Symfony

我知道问题来自本机 SQL 查询。我不知道为什么它会影响我的下一个查询。这就是我的情况的更新。我知道要解决什么问题,希望我能尽快提供解决方案;)

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

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

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

仍在努力。

4

1 回答 1

0

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

你有几个选择:

a) 使用Doctrine DBAL代替 ORM。DBAL 与使用 mysql 准备好的语句几乎相同。结果出现在数组中,而不是像 ORM 那样出现在对象中。

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

于 2016-12-17T12:54:49.150 回答