3

我安装了Beberlei DoctrineExtensions但无法让 mysql DAY 和 YEAR 工作。

我的自动加载器中有这个:

$doctrineExtensions = new Doctrine\Common\ClassLoader('DoctrineExtensions', ROOT.DS.'library');
$doctrineExtensions->register();

当我尝试执行以下 dql 语句时

   SELECT YEAR(e.eventdate) FROM \Entities\Event e

我收到以下错误:错误:预期的已知函数,在 /usr/local/lib/php/Doctrine/ORM/Query/QueryException.php:42 中获得了“YEAR”

在我的文件顶部,我有

use \DoctrineExtensions\Query\Mysql; 

如果我输入,我可以看到它可以找到类:

    $test = \DoctrineExtensions\Query\Mysql\Year::getSql();

但如果我输入

    $test = Year::getSql();

似乎缺少一些实现,但无法找出问题所在..

4

3 回答 3

2

请注意,Doctrine\Common\ClassLoader现在已弃用其他答案中使用的内容。

正确的方法是这样的:

use DoctrineExtensions\Query\Mysql\Year;
...
$config = new \Doctrine\ORM\Configuration();
// Can also be:
// $config = \Doctrine\ORM\Tools\Setup::createConfiguration();
// Or:
// $config = \Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration([...]);
$config->addCustomDateTimeFunction('YEAR', Year::class);

您还可以使用完全限定的类名从配置文件加载Doctrine\ORM\Configuration setCustomDateTimeFunctions([...]),如下所示:

doctrine:
  orm:
    dql:
      datetime_functions:
        year: DoctrineExtensions\Query\Mysql\Year
        month: DoctrineExtensions\Query\Mysql\Month
于 2020-08-04T16:31:31.813 回答
-1

您需要注册该功能:

$classLoader = new \Doctrine\Common\ClassLoader('DoctrineExtensions');
$classLoader->register();
...

$config = $this->getEntityManager()->getConfiguration();
$config->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');
于 2015-11-18T22:11:28.877 回答
-1

有点晚了 :) 但它会帮助像我这样从客户那里获得旧项目的其他人。

您必须注册 DoctrineExtension 目录的命名空间:

$classLoader = new \Doctrine\Common\ClassLoader('DoctrineExtensions', APPPATH . 'libraries/vendor/beberlei');
$classLoader->register();

现在,当您DoctrineExtensions从 composer 获取时,它位于src目录下,因此只需向上移动src目录的内容(在 下DoctrineExtensions)并将所需的扩展名添加到 config :

$config->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');
于 2018-08-20T14:25:42.827 回答