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

Mar*_*arc 14 regex doctrine-query doctrine-orm

根据标题,如何使用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().'-%');
Run Code Online (Sandbox Code Playgroud)

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

使用Doctrine 2查询构建器的任何方法吗?

mur*_*tho 27

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

"beberlei/DoctrineExtensions": "0.3.x-dev",
Run Code Online (Sandbox Code Playgroud)

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

doctrine:
    orm:
        dql:
            string_functions:
                regexp: DoctrineExtensions\Query\Mysql\Regexp
Run Code Online (Sandbox Code Playgroud)

你的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();
Run Code Online (Sandbox Code Playgroud)

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

  • 指点参考会很好.https://github.com/beberlei/DoctrineExtensions (3认同)

Cha*_*yer 7

REGEXP 是供应商特定的函数,因此 Doctrine 本身不支持它。另外,它不是一个函数,而是一个比较运算符(请参阅此答案)。但是您可以使用该字段上的函数来与另一个值进行比较。DoctrineExtensions(由 Doctrine 贡献者编写)具有在 MySQL 中启用正则表达式的代码。

文件中的示例:

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

如果您不想使用 DoctrineExtensions,您可以按照此博客文章编写您自己的扩展,或者您可以查看此 Doctrine 扩展的代码并编写您自己的自定义 DQL 函数。

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


Max*_*nce -1

未测试(对于 MySQL):

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