1

私は 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'); のような外部キーではうまくいかないようです。

まだ作業中です。

4

1 に答える 1

0

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

いくつかの選択肢があります。

a) ORM の代わりにDoctrine DBALを使用します。DBAL は、mysql のプリペアド ステートメントを操作するのとほぼ同じです。結果は、ORM のようにオブジェクトではなく配列になります。

b)手動で入力されるエンティティとプロパティを定義する必要があるネイティブ SQLを使用します。

于 2016-12-17T12:54:49.150 に答える