Regex 带有条令2查询生成器的正则表达式?
根据标题,正则表达式如何与Doctrine 2查询生成器匹配?基本上我是在尝试产生独特的鼻涕虫 这是我当前的实现。我产生子弹。然后我检查是否有像这个弹头一样的弹头在使用。如果有,我将在slug的末尾追加一个-{number},其中{number}是尚未使用的最低数字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(
$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);