2016-12-17 13 views
1

私は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');

まだ作業中です。

答えて

0

この種類のクエリはDQLでは機能しません。

あなたは選択肢のカップルを持っている:

A)はDoctrine DBALの代わりに、ORMを使用しています。 DBALは、mysqlプリペアドステートメントでの作業とほぼ同じです。結果はORMのように配列内に存在し、オブジェクト内には存在しません。

b)Native SQLを使用して、手動で入力するエンティティとプロパティを定義する必要があります。

+0

ありがとうございます! すべてのプロジェクトですでにORMが使用されているので、ネイティブSQLの方法に行きました。私はそれが働いているが、私は次の質問の結果にいくつかの問題があります。 私はメインのメッセージを詳細で編集します。 –

+0

ネイティブクエリを使用するコードを追加する可能性があります。 –

+0

こんにちは、以前は何の回答もありませんでした。だから私は問題がどこにあるかを知りました。私は自分のネイティブSQLで "id"を取得しようとしていただけなので、何とかsymfonyに次のリクエストのIDだけを渡すよう指示します。 (あなたが何を言っているかは分かりません。)とにかく。私はネイティブSQLの行全体を選択することでこれを修正しました。私はできるだけ早くメッセージを更新します –