【问题标题】:How to query a JSON column using the -> operator in mariadb如何使用 mariadb 中的 -> 运算符查询 JSON 列
【发布时间】:2021-08-16 16:39:42
【问题描述】:

我正在尝试获取将 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


    【解决方案1】:

    不,您无法进行任何配置更改来启用此功能。

    引用 MariaDB 在differences between 10.5 and MySQL (8) 上的文档:

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

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


    我想你可以用正则表达式替换来编辑 Laravel 生成的 SQL 就在执行 SQL 之前,但这既很难执行,而且看起来太 hacky 了值得。相比之下,原始的 where 查询并没有那么难看:

    $table->whereRaw('JSON_VALUE(schedule_with, ?) = ?', ['$.company_person', 3])
    

    【讨论】:

    • 附带说明一下,根据链接页面,MariaDB 似乎没有 JSON type,而是将 JSON 存储在普通文本列中,并且具有适用于文本字段的功能。 MySQL 和 Postgres (etc) 有一个实际独立的类型,并有专门针对这些类型的自定义运算符。
    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2018-10-18
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多