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 表中现有行的行。
| 归档时间: |
|
| 查看次数: |
606 次 |
| 最近记录: |