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