我想在本机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栏:错误:预期的已知功能,得到'年'
如何使用Doctrines查询构建器实现我的查询?
备注:
YEAR()
等语句,例如为seen here。但我正在寻找避免包含第三方插件的方法。答案 0 :(得分:31)
您可以添加Doctrine extension,以便在Symfony上添加此配置时可以使用MySql YEAR
和MONTH
语句:
doctrine:
orm:
dql:
string_functions:
MONTH: DoctrineExtensions\Query\Mysql\Month
YEAR: DoctrineExtensions\Query\Mysql\Year
现在您可以在DQL或querybuilder中使用MONTH和YEAR语句。
答案 1 :(得分:3)
orocrm/doctrine-extensions似乎也是一个很好的项目
它支持 MySQL 和 PostgreSql ..目标是跨数据库
答案 2 :(得分:1)
转到this page并选择数据库系统并选择所需的功能
... 我也遇到了与您相同的问题...然后,我使用与github文件中的名称完全相同的名称修改了doctrine.yaml文件,并且它起作用了。
答案 3 :(得分:0)
在 Symfony 4 中,如果使用,则必须安装DoctrineExtensions。
dql:
string_functions:
MONTH: DoctrineExtensions\Query\Mysql\Month
YEAR: DoctrineExtensions\Query\Mysql\Year
安装命令:
composer require beberlei/DoctrineExtensions
答案 4 :(得分:0)
对于Symfony 4:
doctrine:
orm:
dql:
datetime_functions:
DAY: DoctrineExtensions\Query\Mysql\Day
MONTH: DoctrineExtensions\Query\Mysql\Month
YEAR: DoctrineExtensions\Query\Mysql\Year
public function somex()
{
$em = $this->getDoctrine()->getManager();
$emConfig = $em->getConfiguration();
$emConfig->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');
$emConfig->addCustomDatetimeFunction('MONTH', 'DoctrineExtensions\Query\Mysql\Month');
$emConfig->addCustomDatetimeFunction('DAY', 'DoctrineExtensions\Query\Mysql\Day');
$day = '22';
$month = '4';
$qb = $em->createQueryBuilder()
->select('u')
->from('App\Entity\User', 'u')
->where('DAY(u.somedate) = :day')
->andwhere('MONTH(u.somedate) = :month')
->setParameter('month', $day)
->setParameter('day', $month)
;
$trab = $qb->getQuery()->getResult();
return $this->render('intranet/somex.html.twig', [
'trab' => $trab
]);
}
````