我正在研究 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'); 这样的外键。
仍在努力。