5

我编写了以下自定义 walker 来使用 postgres 的 ilike 而不是 like:

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' );

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

4

2 回答 2

8

Doctrine 2.5defaultQueryHint在 orm 配置上有一个新选项。您可以为所有查询设置一次自定义 walker:

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

boot您可以在bundle 类的方法中使用此代码:

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'
            );
    }
}
于 2015-05-04T09:47:18.053 回答
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.. )在每次执行查询之前插入。

于 2013-04-27T09:52:03.700 回答