40

ネイティブ SQL で次のようなクエリを実行したいと考えています。

SELECT
    AVG(t.column) AS average_value
FROM
    table t
WHERE
    YEAR(t.timestamp) = 2013 AND
    MONTH(t.timestamp) = 09 AND
    DAY(t.timestamp) = 16 AND
    t.somethingelse LIKE 'somethingelse'
GROUP BY
    t.somethingelse;

これをDoctrineのクエリビルダーで次のように実装しようとしている場合:

$qb = $this->getDoctrine()->createQueryBuilder();
$qb->select('e.column AS average_value')
   ->from('MyBundle:MyEntity', 'e')
   ->where('YEAR(e.timestamp) = 2013')
   ->andWhere('MONTH(e.timestamp) = 09')
   ->andWhere('DAY(e.timestamp) = 16')
   ->andWhere('u.somethingelse LIKE somethingelse')
   ->groupBy('somethingelse');

エラー例外が発生します

[構文エラー] 行 0、列 63: エラー: 既知の関数が予期され、'YEAR' を取得しました

Doctrines クエリビルダーでクエリを実装するにはどうすればよいですか?

ノート:

  • Doctrine の Native SQLについて知っています。これを試してみましたが、生産データベース テーブルと開発データベース テーブルの名前が異なるという問題が発生します。データベースにとらわれずに作業したいので、これはオプションではありません。
  • 私はデータベースにとらわれずに作業したいのですが、参考までに、私はMySQLを使用しています。
  • YEAR()Doctrine を拡張してetc. ステートメントを「学習」する方法があります。しかし、サードパーティのプラグインを含めないようにする方法を探しています。
4

5 に答える 5

55

Doctrine 拡張機能を追加して、Symfony を使用している場合は、この構成を追加することで MySqlYEARMONTHステートメントを使用できるようにすることができます。

doctrine:
    orm:
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year

DQL またはクエリビルダーで MONTH ステートメントと YEAR ステートメントを使用できるようになりました。

注: この拡張機能は、MySQL、Oracle、PostgreSQL、および SQLite をサポートしています。

于 2013-10-16T10:09:32.560 に答える
3

orocrm/doctrine-extensionsも良いプロジェクトのようです

MySQLPostgreSqlの両方をサポートしています。目標はクロス DBです。

于 2015-08-05T13:33:37.670 に答える