Laravel Eloquent 查找日期在 JSON 列范围内的所有记录

Mar*_*sen 11 php mysql json laravel eloquent

我正在尝试使用 Eloquent 来查询数据库中的记录表,并且只检索那些由对象数组组成的 json 列中至少有 1 条记录在给定日期范围内的记录。

日期列如下所示:

[
  {'date': '2021-01-01'},
  {'date': '2021-01-02'},
  {'date': '2021-01-03'},
]
Run Code Online (Sandbox Code Playgroud)

如果我通过了“2021-01-01”的开始日期,则需要获取所有日期的记录。*.date 等于或晚于该开始日期。

这同样适用于 end_date。

我有不同类型的语法,例如:

$this->where('dates->[*]->date', '<=', date($value));
$this->where('dates->*->date', '<=', date($value));
$this->where('dates.*.date', '<=', date($value));
Run Code Online (Sandbox Code Playgroud)

似乎没有任何效果。

我究竟做错了什么?

Fre*_*edt -1

JSON_TABLE可能是执行此操作的唯一(好的)纯 SQL 方法。这需要 MySQL 8.0.4 或更高版本。这是 Eloquent 的情况:

$this->whereExists(function($query) {
        $query->fromRaw(
            'json_table(json_extract(`dates`, "$[*].date"), "$[*]" columns(`json_date` date path "$")) as `sub`'
        )
        ->where('json_date','>=','2021-01-01');
    })->get();
Run Code Online (Sandbox Code Playgroud)

解释:

json_extractwith$[*].date作为路径参数将数据转换为常规数组["2020-01-01", "2020-01-02", "2020-01-03"]

json_table将 json 数据转换为常规 sql 行:

json_日期
2020-01-01
2020-01-02
2020-01-03

应用 where 子句并将结果行过滤为仅包含json_datejson 表中现有行的行。