2013-04-27 42 views
4

我写了下面的自定义步行者使用的Postgres的的ILIKE,而不是像:默认情况下,所有的应用定制学说输出沃克查询

use Doctrine\ORM\Query\SqlWalker; 

class IlikeWalker extends SqlWalker 
{ 
    /** 
    * Walks down a SelectClause AST node, thereby generating the desired SQL. 
    * 
    * @param $selectClause 
    * @return string The SQL. 
    */ 
    public function walkLikeExpression($likeExpr) 
    { 
     $sql = parent::walkLikeExpression($likeExpr); 
     $sql = str_replace('LIKE', 'ILIKE', $sql); 
     return $sql; 
    } 
} 

可以通过以下方式添加到任何查询:

 $query->setHint($query::HINT_CUSTOM_OUTPUT_WALKER 
        ,'\DoctrineExtensions\WalkerBundle\Walker\IlikeWalker'); 

但是,如何启动一个服务或应用一个配置来自动将其用于每个查询?

回答

7

Doctrine 2.5在orm配置上有一个新选项defaultQueryHint。您可以设置自定义的步行者一度为所有查询:

class YouBundle extends Bundle 
{ 
    public function boot() 
    { 
     parent::boot(); 
     $this->container 
      ->get('doctrine.orm.entity_manager') 
      ->getConfiguration() 
      ->setDefaultQueryHint(
       Query::HINT_CUSTOM_OUTPUT_WALKER, 
       '\DoctrineExtensions\WalkerBundle\Walker\IlikeWalker' 
      ); 
    } 
} 
1

您不能全局设置此提示。因此,要解决你的问题,我看到有两种方式:

1)注册和使用自己的学说功能ILIKE(例如这里https://github.com/domudall/DoctrineExtensions/blob/master/lib/Dmno/DoctrineExtensions/Comparison/Postgresql/Ilike.php

2)使用AOP拦截器(https://github.com/schmittjoh/JMSAopBundle/blob/master/Resources/doc/index.rst)每次执行的前插入$query->setHint..查询。

+0

不好有没有办法解决:

<?php /** @var \Doctrine\ORM\EntityManager $em */ $em->getConfiguration()->setDefaultQueryHint( Query::HINT_CUSTOM_OUTPUT_WALKER, '\DoctrineExtensions\WalkerBundle\Walker\IlikeWalker' ) 

可以在boot方法捆绑软件类使用此代码。我会接受这一点,因为虽然它不能解决问题,但它提供了前进的道路。我稍后会检查xtension。 – Lighthart 2013-04-28 18:57:21

相关问题