【问题标题】:DoctrineExtensions(Beberlei) does not work - Doctrine 2DoctrineExtensions(Beberlei) 不起作用 - 教义 2
【发布时间】:2012-10-21 08:45:57
【问题描述】:

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

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

【问题讨论】:

    标签: doctrine doctrine-orm dql doctrine-extensions


    【解决方案1】:

    请注意,其他答案中使用的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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        你需要注册函数:

        $classLoader = new \Doctrine\Common\ClassLoader('DoctrineExtensions');
        $classLoader->register();
        ...
        
        $config = $this->getEntityManager()->getConfiguration();
        $config->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-09
          相关资源
          最近更新 更多