私は 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: [Semantical Error] line 0, col 55 near '( SELECT': Error: Class '(' is not defined.
助けてくれてありがとう。私はまだ Symfony の初心者です ;)
アップデート。
私はネイティブSQLにそれほど適合していないので。これを2つのクエリで行うことにしました。1/ ネイティブ SQL を使用すると、max(points) で ID を取得します。 2/ ORM を使用すると、findById($arrayIDs) を実行するだけです。ManyToMany 関係があり、完全なデータを取得する方が簡単だからです。
したがって、ほとんど機能しますが、理解できない理由により、2番目のクエリは次のように 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 以外はどこでも null)
しかし、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 です。理解に役立ちます): Dump Symfony
問題がネイティブ SQL クエリに起因することはわかっています。次のクエリに影響する理由がわかりません。それが私の状況に関する最新情報です。私は何を修正すべきかを知っています。うまくいけば、すぐに解決策を見つけられるでしょう ;)
これらの行を追加してネイティブSQLを完成させたことを追加したいだけです:
$rsm->addFieldResult('s', 'points', 'points');
$rsm->addFieldResult('s', 'stats', 'stats');
$rsm->addFieldResult('s', 'day', 'day');
しかし、これまでのところ、ゲーム $rsm->addMetaResult('s', 'game_id', 'game'); のような外部キーではうまくいかないようです。
まだ作業中です。