【问题标题】:Using REGEXP in Doctrine 2.x ORM在 Doctrine 2.x ORM 中使用 REGEXP
【发布时间】:2012-01-10 21:00:52
【问题描述】:

我对此进行了大量研究,我确信答案是否定的,但我很想证明是错误的。

我想执行一个用 DQL 编写的包含 REGEXP 操作的查询。例如:

select * from assets 
where campaign_id = 1
and fileName REGEXP 'godzilla*'
order by fileName desc

又名

$builder->add('select', 'a.fileName')
        ->add('from',    '\Company\Bundle\Entity\Asset a')
        ->add('where',   'a.campaign=1')
        ->...REGEXP MAGIC...
        ->add('orderBy', 'a.fileName desc');

(这是一个简单的正则表达式,我意识到可以像 LIKE 一样完成,但这只是一个例子——我真正的正则表达式更复杂)

我查看了 Doctrine\ORM\Query\Expr 类以及 QueryBuilder 类。我看不到对 REGEXP 的支持。 SO 上有人发帖说他们使用了 Expr 类,但这实际上不起作用(他们说它未经测试)。

知道如何在不编写直接 SQL 的情况下在 DQL 中执行 REGEXP 吗? TIA。

【问题讨论】:

    标签: php orm doctrine doctrine-orm


    【解决方案1】:

    问题不在于查询生成器无法为 MySQL 中的(非标准)REGEXP 功能创建查询,而更多的是即使您可以生成查询,DQL 解析器也无法在不做任何事情的情况下理解它关于它。

    那个“东西”正在扩展 Doctrine 的 DQL 以理解正则表达式语法。这可以通过扩展 DQL 来实现,如 in a blog post 所述。

    更多信息请研究MySQL part of DoctrineExtensions的代码

    【讨论】:

    • 博文链接错误,它不再是最新的(doctrine1)吗?
    • @PetterSoderlund 已修复
    • 需要注意的一点:您必须在 REGEXP 的末尾添加一个比较运算符,否则 Doctrine 会将其踢回。 Doctrine 要求所有 where 子句都有一个比较运算符,即使 REGEXP 不需要它
    【解决方案2】:

    目前你不能用 Doctrine2 做到这一点。您可以添加自定义函数,但 REGEXP 不是函数,而是比较运算符。 Doctrine2 尚不支持海关比对算子。

    看看这个论坛帖子:https://groups.google.com/group/doctrine-user/browse_thread/thread/b98e37fc296c8183/06782192719156c6?lnk=gst&q=regexp#06782192719156c6

    您应该使用本机 SQL:http://www.doctrine-project.org/docs/orm/2.1/en/reference/native-sql.html

    【讨论】:

      【解决方案3】:

      可以执行以下操作,但不是很漂亮:

      $builder->add('select', 'a.fileName')
              ->add('from',    '\Company\Bundle\Entity\Asset a')
              ->add('where',   'a.someField REGEXP '.$someRegex);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多