如何在 MariaDB 中使用 -> 运算符查询 JSON 列

问题描述 投票:0回答:2

我正在尝试获取时间表,将 JSON 列数据与 Laravel 项目中的以下代码进行比较:

$schedules = Schedule::where('schedule_with->company_person', $contact_company_person->id)->get();

这会生成如下 SQL 查询:

select * from `schedules` where `schedule_with`->'$."company_person"' = 1;

虽然这适用于 MYSQL 5.7 及更高版本,但不适用于 MARIADB 10.5。但 MARIADB 从 10.2 开始已经支持 JSON 列。 对于 MARIADB,以下查询有效:

select * from schedules where JSON_Value(schedule_with, "$.company_person") = 3;

Laravel 中是否需要进行一些配置更改才能使其正常工作?

我知道它可以通过原始查询来实现,我很好奇我错过了什么?

php mysql laravel mariadb
2个回答
8
投票

不,您无需更改配置即可启用此功能。

引用MariaDB的文档关于10.5和MySQL之间的差异(8)

MariaDB 10.5 不支持 MySQL 的 JSON 运算符(-> 和 ->>)。

“没有如果,没有但是”。


我猜你可以使用正则表达式替换来编辑 Laravel 生成的 SQL(在 SQL 执行之前),但这既很难执行,又看起来太老套了,不值得。相比之下,原始的 where 查询并没有那么难看: $table->whereRaw('JSON_VALUE(schedule_with, ?) = ?', ['$.company_person', 3])



1
投票

MariaDB 从今天的 11.6 版本开始不支持此功能。

功能请求于 2017 年创建:

MDEV-13594

您可以查看每个版本的

MySQL 和 MariaDB 之间的兼容性和差异

(在我撰写本文时,文档停在 MariaDB 11.3 和 MySQL 8.0 之间的兼容性和差异)。 话虽这么说,可以做与

->

->>
相同的事情,因为它们只是
JSON_EXTRACT
的别名,以及
JSON_EXTRACT
JSON_UNQUOTE
的组合。
-- MySQL
SELECT title->fr FROM movies;

-- MariaDB
SELECT json_extract(title, '$.fr') FROM movies;


-- MySQL
SELECT title->>fr FROM movies;

-- MariaDB
SELECT json_unquote(json_extract(title, '$.fr')) FROM movies;

如果您想了解更多有关 JSON 函数的信息,请参阅以下内容:

    MySQL 中的 JSON 函数
  • MariaDB 中的 JSON 函数
© www.soinside.com 2019 - 2024. All rights reserved.