我有一个包含JSON列的表,它的类型为longtext(DC 2 Type:json)。此表在Symfony项目的Doctrine ORM中包含一个实体。我希望使用变量$qb
中的Doctrine查询构建器,基于JSON列中的字段进行查询
我该怎么做呢?我在网上找到的所有东西都说要安装第三方软件包来实现这一点。难道没有办法只用Doctrine的查询构建器来实现而不安装另一个软件包吗?
我尝试的一个(可能是愚蠢的)变通方法是将列视为字符串,并执行...
$qb->andWhere("my_data LIKE \"%id:\\\"1,%\"");
例如,如果我想查询JSON列my_data
来查找字符串中包含id":1,
的blob,这会失败,并出现一个非常奇怪的语法错误,而且无论如何也不是查询JSON字段的正确方法。然而,直接在SQL客户端中执行LIKE查询是我想要的方式,所以我也不知道为什么在Doctrine中会失败。
编辑:这是MySQL / MariaDB。
1条答案
按热度按时间jk9hmnmh1#
Doctrine查询语言是相当有限的。它只涵盖了最基本/常见的SQL函数,这对99%的用例来说已经足够了,但不是全部。
如果您的MariaDB版本本身支持JSON(例如10.2或更高版本),则可以使用native functions处理JSON数据。(如果您不支持,则您的解决方案是唯一的选择,可能需要在应用程序中进行一些额外的过滤)。
为了能够在DQL中使用这些函数,您要么需要define them yourself,要么使用第三方库,如scienta/doctrine-json-functions(请注意,它有关于如何将其与Symfony一起使用的文档,而且非常简单)。
如果您只需要一个额外的函数,并且出于某种原因不需要整个包,则可以复制这个类并将其用作自己的类。
或者,您可以放弃DQL而直接编写SQL,但这样您就不能直接将数据转换为对象,也不能对数据使用其他Doctrine魔法,但对于简单的用例来说,这已经足够了。