我正在研究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');
仍在努力。
答案 0 :(得分:0)
这种查询在DQL中不起作用。
您有几个选择:
a)使用Doctrine DBAL代替ORM。 DBAL与使用mysql预处理语句几乎相同。结果出现在数组中,而不是像ORM一样出现在对象中。
b)使用Native SQL,您必须定义将手动填充的实体和属性。