使用Doctrine 2查询构建器的正则表达式?

时间:2011-07-04 18:07:20

标签: regex doctrine-orm doctrine-query

根据标题,如何使用Doctrine 2查询构建器匹配正则表达式?基本上我正试图产生独特的slu ..

这是我目前的实施。我生成了slu ..然后我检查是否有像这个slug一样使用的slu ..如果有,我会将一个 - {number}附加到slug的末尾,其中{number}是尚未使用的最低数字。

$qb->select(array('partial o.{id, slug}'))
   ->from('Foo\Bar\Entity\Object', 'o')
   ->where($qb->expr()->like('o.slug', ':slug'));

$slug = new SlugNormalizer($text);
$qb->setParameter('slug', $slug->__toString().'-%');

这里的问题是LIKE slug%可以匹配foo-bar-1,foo-bar-2和AND foo-bar-not-the-same-slug。更清洁的是寻找REGEX slug的正则表达式 - (\ d +)或类似的东西。

使用Doctrine 2查询构建器以任何方式执行此操作吗?

4 个答案:

答案 0 :(得分:25)

添加DoctrineExtensionsBundle - 更新你的composer.json:

"beberlei/DoctrineExtensions": "0.3.x-dev",

添加REGEXP配置 - 更新您的app / config.yml

doctrine:
    orm:
        dql:
            string_functions:
                regexp: DoctrineExtensions\Query\Mysql\Regexp

你的QueryBuilder在哪里这样做:

$qb = $this->createQueryBuilder('x');

return $qb->andWhere('REGEXP(x.your_property, :regexp) = true')
          ->setParameter('regexp', '[[:digit:]]{3}') // insert your own regex here
          ->getQuery()->getResult();

并且不要忘记使用SQL兼容的正则表达式

答案 1 :(得分:3)

REGEXP是特定于供应商的功能,因此Doctrine本身不支持它。另外,它不是一个比较运算符(see this answer)的函数。但您可以使用该字段上的函数与另一个值进行比较。 DoctrineExtensions(由学说的撰稿人编写)具有在MySQL中启用正则表达式的代码。

文件示例:

$query = $this->getEntityManager()->createQuery('SELECT A FROM Entity A WHERE REGEXP(A.stringField, :regexp) = 1');
$query->setParameter('regexp', '^[ABC]');
$results = $query->getArrayResult();

如果您不想使用DoctrineExtensions,可以按照this blog post编写自己的文件,也可以look at the code for this Doctrine extension编写自己的自定义DQL函数。

我已经确认使用DoctrineExtensions的REGEXP非常适合我的需求!

答案 2 :(得分:0)

我确实喜欢这个

 $query->andWhere('REGEXP(r.status, :text) = 1')
       ->orWhere('REGEXP(r.comment, :text) = 1')
       ->setParameter('text',MY REGULAR EXP);

答案 3 :(得分:-2)

未经测试(适用于MySQL):

$qb->where(new Doctrine\ORM\Query\Expr\Comparison(
    'o.slug', 'REGEXP', ':slug')
);
$qb->setParameter('slug', '^'.$slug->__toString().'-[[:digit:]]+$');