我正在尝试使用 Eloquent 来查询数据库中的记录表,并且只检索那些由对象数组组成的 json 列中至少有 1 条记录在给定日期范围内的记录。
日期列如下所示:
[
{'date': '2021-01-01'},
{'date': '2021-01-02'},
{'date': '2021-01-03'},
]
如果我通过了“2021-01-01”的开始日期,则需要获取所有日期的记录。*.date 等于或晚于该开始日期。这同样适用于 end_date。
我有不同类型的语法,例如:
$this->where('dates->[*]->date', '<=', date($value));
$this->where('dates->*->date', '<=', date($value));
$this->where('dates.*.date', '<=', date($value));
似乎没有任何效果。我究竟做错了什么?
最佳答案
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();
解释:json_extract
与 $[*].date
由于路径参数将数据转换为常规数组 ["2020-01-01", "2020-01-02", "2020-01-03"]
)json_table
将 json 数据转换为常规 sql 行:json_date
2020-01-01
2020-01-02
2020-01-03
应用 where 子句并将结果行过滤为仅具有现有
json_date
的行。 json 表中的行。
关于php - Laravel Eloquent 查找日期在 JSON 列范围内的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67837261/