ネイティブ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クエリビルダでクエリを実装するにはどうすればよいですか?
注:
YEAR()
などのステートメントを「学習」する方法があります。たとえば、 seen のように。サードパーティのプラグインが含まれないようにします。Doctrine extension を追加して、Symfonyを使用している場合、この設定を追加することでMySql YEAR
およびMONTH
ステートメントを使用できます。
doctrine:
orm:
dql:
string_functions:
MONTH: DoctrineExtensions\Query\Mysql\Month
YEAR: DoctrineExtensions\Query\Mysql\Year
これで、DQLまたはクエリビルダーでMONTHおよびYEARステートメントを使用できます。
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
orocrm/doctrine-extensions も良いプロジェクトのようです
MySQLとPostgreSqlの両方をサポートしています。目標はcross DB