DoctrineExtensions(Beberlei) не работает - Doctrine 2

Я установил 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

Я получаю следующую ошибку: Ошибка: ожидаемая известная функция, получено значение "YEAR" в /usr/local/lib/php/Doctrine/ORM/Query/QueryException.php:42

В верхней части моего файла у меня есть

use \DoctrineExtensions\Query\Mysql; 

И я вижу, что он может найти класс, если я наберу:

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

Но нет, если я наберу

    $test = Year::getSql();

Кажется, что какая-то реализация отсутствует, но не могу понять, в чем проблема.


person Saggo    schedule 31.10.2012    source источник


Ответы (3)


Обратите внимание, что 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
person LiquidPony    schedule 04.08.2020

Вам нужно зарегистрировать функцию:

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

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

Немного поздно :) но это поможет таким как я получить от клиента старый проект.

Вы должны зарегистрировать пространство имен каталога DoctrineExtension:

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

Теперь, когда вы получаете DoctrineExtensions из composer, он попадает в каталог src, поэтому просто переместите содержимое каталога src (под DoctrineExtensions) и добавьте необходимое расширение в конфигурацию:

$config->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');
person Charles C.    schedule 20.08.2018