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
相关产品推荐
相关产品推荐

