如何使用mysql在laravel中进行json列搜索?

fiei3ece  于 2023-01-20  发布在  Mysql
关注(0)|答案(1)|浏览(206)

我正在使用laravel框架来开发API,我有一个包含对象数组的表,我需要搜索标签,我必须以逗号分隔格式获取ID,因为我正在使用Json表概念,它抛出了以下错误,您能帮助我解决这个问题吗?

    • 错误**
"SQLSTATE[42S22]: Column not found: 1054 Unknown column 't1' in 'where clause' (SQL: select (SELECT id FROM JSON_TABLE( pfl_optionsvalue,'$[*]' COLUMNS( label VARCHAR(40) PATH '$.label', TYPE VARCHAR(40) PATH \r\n                                                        '$.type', id VARCHAR(40) PATH '$.id' ) ) AS jt WHERE jt.label IN (t1,t2,t3) ) AS ss from `bm_predefinedlabels` where `pfl_id` = 514)",
    • 代码**
$a = '('.$customarray[$primaryId].')'; // $a = "(t1,t2,t3)"
 $temp = bm_predefinedlabels::where('pfl_id',$primaryId)
                      ->select(DB::raw("(SELECT id FROM JSON_TABLE( pfl_optionsvalue,'$[*]' COLUMNS( label VARCHAR(40) PATH '$.label', TYPE VARCHAR(40) PATH 
                                                        '$.type', id VARCHAR(40) PATH '$.id' ) ) AS jt WHERE jt.label IN {$a} ) AS ss"))
                                        ->get();
    • pfl_optionsvalue数据的表列**
[{"label":"t1","checked":false,"id":1,"delete":0,"validationerror":null},{"label":"t2","checked":false,"id":2,"delete":0,"validationerror":null}]
guykilcj

guykilcj1#

错误消息指示未找到“where子句”中的列“t1”。这是因为$a的值是“(t1,t2,t3)",该值作为字符串传递,但需要作为值列表传递。可以使用explode()函数将字符串转换为数组,然后使用inplode()将数组转换为字符串。

$a = explode(",",$customarray[$primaryId]);
$a = implode("','",$a);

然后在SQL查询的IN语句中传递变量$a。

$temp = bm_predefinedlabels::where('pfl_id',$primaryId)
->select(DB::raw("(SELECT id FROM JSON_TABLE( pfl_optionsvalue,'$[*]' COLUMNS( label VARCHAR(40) PATH '$.label', TYPE VARCHAR(40) PATH '$.type', id VARCHAR(40) PATH '$.id' ) ) AS jt WHERE jt.label IN ('{$a}') ) AS ss"))
->get();

您还需要确保您的MySQL版本支持JSON_TABLE函数。

相关问题