学说:如何使用替换功能

时间:2014-05-23 09:12:42

标签: php mysql symfony doctrine-orm doctrine

我需要你的帮助才能使用Doctrine构建我的查询。我是一个symfony初学者。 首先,我在MySQL SQL选项卡中构建了我的查询,它运行正常。

SELECT * 
FROM contact
WHERE insee like '03%'
ORDER BY (LENGTH(tif) - LENGTH(REPLACE(tif,";",""))) DESC

To be more precise, my tif field looks like that : 
1 - 01.02.01.02;01.02.03.04;01.05.06 (3 subsets)
2 - 01.02.03.08.07.01.02.03.08.0701.02.03.08.07; (1 subset)
3 - 01.02.01;02.06.05 (2 subsets) 

我需要通过desc获取代码的数量,以获得订单1,3,2。

现在我尝试在Symfony上的存储库类中构建它 我发现在Doctrine上不存在替换功能所以我试图通过以下操作来避开它:

$qb = $this->getEntityManager()
            ->createQueryBuilder()
            ->select('c')
            ->from('SgaContactBundle:Contact', 'c')
            ->where('c.insee LIKE :insee')
            ->setParameter('insee', '%' . $insee . '%');

$qb->orderBy($qb->expr()->diff(
            $qb->expr()->length('c.tif'), 
            $qb->expr()->length(preg_match_all('/;/i', 'c.tif')) ),
            'DESC');
return $qb->getQuery()
          ->getResult();

最后我遇到了这个错误:

 [Syntax Error] line 0, col 99: Error: Expected StateFieldPathExpression | string | 
 InputParameter | FunctionsReturningStrings | AggregateExpression, got '0'

如何更换“替换功能”,我该怎么办? 我尝试了preg_replace,preg_match,最后是preg_match_all,但出了点问题。

感谢您的帮助

3 个答案:

答案 0 :(得分:8)

Doctrine DQL没有替换功能。但是您可以实现自己的用户定义函数。见https://stackoverflow.com/a/21652988/2015279

答案 1 :(得分:1)

只是一个警告:

在创建自己的DQL函数时要小心,你必须创建一个首字母大写的类,但在app / config.yml上更改。

我在生产模式下陷入困境,而我在开发模式下没遇到问题。 但是当我改变时:

class replaceFunction extends FunctionNode{

通过

class ReplaceFunction extends FunctionNode{

一切正常。

也可以对app / config.yml文件进行更改。

答案 2 :(得分:0)

您可以实现自己的函数,例如验证响应,或者可以使用此Doctrine Extension程序包,其中包括REPLACE()mysql函数以及更多功能(与ROUND,ASIN ...匹配):https://github.com/beberlei/DoctrineExtensions < / p>

只需将其安装到您的项目中

composer require beberlei/doctrineextensions

并将所需的功能(仅)添加到config.yml的conf文件中:

# Doctrine Configuration
doctrine:
    orm:
    entity_managers:
        default:
        #...
            dql:
                string_functions:
                    match: DoctrineExtensions\Query\Mysql\MatchAgainst
                    replace: DoctrineExtensions\Query\Mysql\Replace

这是查询生成器中REPLACE的一个小例子:

$qb = $this->createQueryBuilder('ts')
    ->where("REPLACE(ts.reference, ' ','') LIKE :reference")
    ->setParameter('reference', $reference)
;

希望它可以对以后的人有所帮助