DoctrineExtensions(Beberlei)不起作用 - 教义2

时间:2012-10-31 18:50:02

标签: doctrine doctrine-orm dql doctrine-extensions

我安装了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

在我的文件顶部,我有

use \DoctrineExtensions\Query\Mysql; 

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

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

但如果我输入

则不行
    $test = Year::getSql();

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

3 个答案:

答案 0 :(得分:0)

您需要注册该功能:

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

$config = $this->getEntityManager()->getConfiguration();
$config->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');

答案 1 :(得分:0)

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

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

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

现在,当您从作曲家那里获得DoctrineExtensions时,它位于src目录下,因此只需向上移动src目录的内容(位于DoctrineExtensions下)并将您需要的扩展名添加到配置中:

$config->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');

答案 2 :(得分:0)

请注意,其他答案中使用的items.stream().anyMatch(item -> item.getAge() == null ? System.out.println()); 已被弃用。

正确的方法是:

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([...])