首页  >  问答  >  正文

如何使用Doctrine查询构建器基于JSON列中的字段进行选择

我有一个带有 JSON 列的表,它的类型为 longtext (DC2Type:json)。该表在我的 Symfony 项目中的 Doctrine ORM 中有一个实体。我想使用变量 $qb

中的 Doctrine 查询构建器基于 JSON 列内的字段进行查询

我该怎么做?我在网上找到的所有内容都说要安装第 3 方软件包才能启用此功能。有没有办法只使用 Doctrine 的查询生成器而不安装另一个包来完成它?

我尝试过的一个(也许是愚蠢的)解决方法是将列视为字符串,然后...

$qb->andWhere("my_data LIKE "%id:\"1,%"");

例如,如果我想查询 JSON 列 my_data 以查找字符串中包含 id":1, 的 blob。这会失败,并出现非常奇怪的语法错误,并且不正确无论如何,查询 JSON 字段的方法。但是,直接在 SQL 客户端中执行 LIKE 查询可以按照我想要的方式工作,所以我也不知道为什么这在 Doctrine 中失败。

编辑:这是 MySQL / MariaDB。

P粉423694341P粉423694341261 天前465

全部回复(1)我来回复

  • P粉724737511

    P粉7247375112024-01-07 11:55:28

    Doctrine 查询语言非常有限。它仅涵盖最基本/常见的 SQL 函数,足以满足 99% 的用例,但不是全部。

    如果您的 MariaDB 版本本身支持 JSON(例如 10.2 或更高版本),您可以使用 原生函数来处理 JSON 数据。 (如果您不这样做,那么您的解决方法是唯一的选择,可能需要在应用程序中进行一些额外的过滤)。

    为了能够在 DQL 中使用这些函数,您需要自己定义它们< /a> 或者确实使用第三方库,例如 scienta/doctrine-json-functions (请注意,有关于如何将它与 Symfony 一起使用的文档,而且非常简单)。

    如果您只需要一个额外的函数,并且出于某种原因不需要整个包,您可以复制该单个类并将其用作您自己的类。

    或者,您可以放弃 DQL 并直接编写 SQL,但这样您就无法直接合并为对象并使用其他 Doctrine 魔法来处理数据。但对于简单的用例来说这已经足够了。

    回复
    0
  • 取消回复