You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中whereJsonContains查询JSON字段异常问题求助

解决Laravel中whereJsonContains的转义异常问题

这个问题的核心是你存储的JSON数据是经过HTML转义的(用"代替了双引号),但Laravel的whereJsonContains方法是针对标准原生JSON格式设计的,所以才会出现双重转义导致查询失效的情况。下面给你两种解决方案:

方案一:修复数据存储格式(推荐)

首先,你的插入语句里把JSON的双引号转成了",这不符合MySQL对JSON数据的存储要求(即使是存TEXT字段,Laravel的JSON查询也需要原生JSON格式)。

1. 修正插入逻辑

以后插入数据时,直接存储原生JSON字符串,不需要转义双引号:

INSERT INTO `Data`(`id`, `data_keys`, `data_values`) VALUES ('300','element','{"id":"300","trx_type":"withdraw","name":"John","date":"2021-09-12","amount":"10","gateway":"USD"}')

如果是用Laravel的模型插入,直接传数组即可,Laravel会自动转成标准JSON:

\App\Models\Data::create([
    'id' => 300,
    'data_keys' => 'element',
    'data_values' => [
        'id' => '300',
        'trx_type' => 'withdraw',
        'name' => 'John',
        'date' => '2021-09-12',
        'amount' => '10',
        'gateway' => 'USD'
    ]
]);

2. 批量修复已存在的数据

如果已经有大量转义的数据,用SQL批量替换修复:

UPDATE `Data` 
SET `data_values` = REPLACE(`data_values`, '"', '"')
WHERE `data_keys` = 'element'; -- 可根据实际需求调整过滤条件

修复完成后,你原来的Laravel查询代码就能正常工作了:

$tabel_data= \App\Models\Data::where('data_keys','element') 
->whereJsonContains('data_values->trx_type','withdraw') 
->get();

方案二:临时调整查询逻辑(无需修改数据)

如果暂时不能修改存储的数据,可以直接使用原生SQL查询,避免Laravel的自动转义:

$tabel_data = \App\Models\Data::where('data_keys', 'element')
    ->whereRaw("JSON_CONTAINS(data_values, '\"withdraw\"', '$.trx_type')")
    ->get();

这里用whereRaw直接构造正确的JSON_CONTAINS语句,绕过Laravel对JSON参数的自动转义处理,就能匹配到你存储的转义后的JSON内容。


内容的提问来源于stack exchange,提问作者khanhminhnguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:32:40