web-dev-qa-db-ja.com

Doctrine2でSQLのYEAR()、MONTH()、DAY()を使用するにはどうすればよいですか?

ネイティブ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のネイティブSQL について知っています。私はこれを試しましたが、私の生産的なデータベーステーブルと私の開発データベーステーブルが異なる名前を持っているという問題につながります。私はデータベースにとらわれない仕事をしたいので、これはオプションではありません。
  • Dbにとらわれない仕事をしたいのですが:参考までに、MySQLを使用しています。
  • Doctrine=を使用してYEAR()などのステートメントを「学習」する方法があります。たとえば、 seen のように。サードパーティのプラグインが含まれないようにします。
27

Doctrine extension を追加して、Symfonyを使用している場合、この設定を追加することでMySql YEARおよびMONTHステートメントを使用できます。

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

これで、DQLまたはクエリビルダーでMONTHおよびYEARステートメントを使用できます。

36
alex88

Symfony 4では、 DoctrineExtensions をインストールする必要があります:

composer require beberlei/DoctrineExtensions

そして、doctrine=設定ファイル(config/packages/doctrine.yaml)を次のように編集します:

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

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

MySQLPostgreSqlの両方をサポートしています。目標はcross DB

2
drAlberT