Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 带有条令2查询生成器的正则表达式?_Regex_Doctrine Orm_Doctrine Query - Fatal编程技术网

Regex 带有条令2查询生成器的正则表达式?

Regex 带有条令2查询生成器的正则表达式?,regex,doctrine-orm,doctrine-query,Regex,Doctrine Orm,Doctrine Query,根据标题,正则表达式如何与Doctrine 2查询生成器匹配?基本上我是在尝试产生独特的鼻涕虫 这是我当前的实现。我产生子弹。然后我检查是否有像这个弹头一样的弹头在使用。如果有,我将在slug的末尾追加一个-{number},其中{number}是尚未使用的最低数字 $qb->select(array('partial o.{id, slug}')) ->from('Foo\Bar\Entity\Object', 'o') ->where($qb->expr(

根据标题,正则表达式如何与Doctrine 2查询生成器匹配?基本上我是在尝试产生独特的鼻涕虫

这是我当前的实现。我产生子弹。然后我检查是否有像这个弹头一样的弹头在使用。如果有,我将在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().'-%');
这里的问题是,slug%可能与foo-bar-1、foo-bar-2和foo-bar不匹配。更干净的是正则表达式寻找正则表达式slug-(\d+)或类似的东西

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

未测试(针对MySQL):


REGEXP是一个特定于供应商的函数,因此条令本身不支持它。另外,与其说它是一个函数,不如说它是一个比较运算符()。但您可以使用字段上的函数与另一个值进行比较。(由doctrine的一位贡献者编写)有代码可以在MySQL中启用正则表达式

文件中的示例:

$query = $this->getEntityManager()->createQuery('SELECT A FROM Entity A WHERE REGEXP(A.stringField, :regexp) = 1');
$query->setParameter('regexp', '^[ABC]');
$results = $query->getArrayResult();
如果您不想使用DoctrineExtensions,可以通过以下方式编写自己的函数,也可以编写自己的自定义DQL函数

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

安装:

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

我就是这么做的

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

这是行不通的。条令\ORM\Query\Expr\Comparison类只有以下运算符:const EQ='=';常数NEQ=“”;常数LT='=';没有REGEXP选项!而且这不是一个比较操作。。。为什么它会住在那里?你是对的,它不起作用。但这是一个比较操作。两个操作数,它们之间的一个运算符,对我来说这是一个比较。啊,当你这样说的时候,也许你是对的。可能是一个比较。。不管怎样,呵呵,它不起作用=[最好指出一个参考。你对
setParameter
(我的常规经验)中的第二个参数是什么意思?setParameter是一种学说方法。
$qb = $this->createQueryBuilder('x');

return $qb->andWhere('REGEXP(x.your_property, :regexp) = true')
          ->setParameter('regexp', '[[:digit:]]{3}') // insert your own regex here
          ->getQuery()->getResult();
 $query->andWhere('REGEXP(r.status, :text) = 1')
       ->orWhere('REGEXP(r.comment, :text) = 1')
       ->setParameter('text',MY REGULAR EXP);