17

根据标题,如何使用 Doctrine 2 查询构建器匹配正则表达式?基本上我正在尝试生成独特的蛞蝓。

这是我目前的实现。我生成蛞蝓。然后我检查是否有像这个 slug 这样的 slug 正在使用。如果有,我将在 slug 的末尾附加一个 -{number} ,其中 {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 和 foo-bar-not-the-same-slug。更清洁的是寻找 REGEX slug-(\d+) 或类似内容的正则表达式。

有什么方法可以用 Doctrine 2 查询生成器做到这一点?

4

4 回答 4

40

安装DoctrineExtensionsBundle

composer require beberlei/doctrineextensions

添加 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 兼容的正则表达式

于 2015-03-13T14:35:20.450 回答
5

REGEXP 是特定于供应商的功能,因此 Doctrine 本身不支持它。另外,它与其说是一个比较运算符,不如说是一个函数(见这个答案)。但是您可以使用该字段上的函数与另一个值进行比较。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,您可以按照此博客文章编写自己的,或者您可以查看此 Doctrine 扩展的代码并编写自己的自定义 DQL 函数。

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

于 2014-11-13T21:41:00.440 回答
-1

未测试(对于 MySQL):

$qb->where(new Doctrine\ORM\Query\Expr\Comparison(
    'o.slug', 'REGEXP', ':slug')
);
$qb->setParameter('slug', '^'.$slug->__toString().'-[[:digit:]]+$');
于 2011-07-05T07:26:02.190 回答
-1

我确实喜欢这个

 $query->andWhere('REGEXP(r.status, :text) = 1')
       ->orWhere('REGEXP(r.comment, :text) = 1')
       ->setParameter('text',MY REGULAR EXP);
于 2017-11-01T08:17:48.437 回答