根据标题,如何使用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查询构建器以任何方式执行此操作吗?
答案 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:]]+$');