私はSymfony 3.2で作業しています。私は "単純な"クエリを実行しようとしています。 この作品のクエリのSQLバージョン(phpMyAdminの中で直接テスト)symfony&Doctrine:DQL Max()with groupBy
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
Unfortuneltyあり、私はそれが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の場合、max(points)を持つIDを取得します 2/ORMを使用して、findById($ arrayIDs)を実行します。
Statsheet {#968 ▼
-id: 20
-stats: null
-points: null
-day: null
-player: null
-game: null
:私は多対多の関係を持っていると私はそうそれはほとんど機能し
完全なデータを取得することが簡単ですが、私はundestandすることができない理由のために、私の2番目のクエリは次のようにnullを与えるので、そのようにやって
}
私はいくつかのテストを行いました。私はこの、ID 20が最大値例えば
であることを知っている:
dump($em->getRepository('PlayoffBundle:Statsheet')->find(19));
- >すべてのデータが正しく得られます。
dump($em->getRepository('PlayoffBundle:Statsheet')->find(20));
- >私はちょうど(IDのexeptどこでもヌル)上記の数行を掲載するもの
を与えるだろう。しかし、私がしなければ - NativeSQL前に>検索(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クエリから来ると知っています。なぜ私の次の質問に影響するのか分かりません。それは私の状況の更新です。
$rsm->addFieldResult('s', 'points', 'points');
$rsm->addFieldResult('s', 'stats', 'stats');
$rsm->addFieldResult('s', 'day', 'day');
それdoesnの:これらの行を追加することにより、
は、私はちょうど私が私のnativeSQL完了したことを、追加したい);私は修正し、うまくいけば、私はすぐに戻っ溶液でてくるものを知っていますこれまでは、ゲームなどの外部キーを使って動作しているように見えます。 $ rsm-> addMetaResult( 's'、 'game_id'、 'game');
まだ作業中です。
ありがとうございます! すべてのプロジェクトですでにORMが使用されているので、ネイティブSQLの方法に行きました。私はそれが働いているが、私は次の質問の結果にいくつかの問題があります。 私はメインのメッセージを詳細で編集します。 –
ネイティブクエリを使用するコードを追加する可能性があります。 –
こんにちは、以前は何の回答もありませんでした。だから私は問題がどこにあるかを知りました。私は自分のネイティブSQLで "id"を取得しようとしていただけなので、何とかsymfonyに次のリクエストのIDだけを渡すよう指示します。 (あなたが何を言っているかは分かりません。)とにかく。私はネイティブSQLの行全体を選択することでこれを修正しました。私はできるだけ早くメッセージを更新します –