如何用雄辩的方式在包含对象数组的json字段中搜索

时间:2019-05-17 13:52:50

标签: json laravel postgresql eloquent

我正在尝试使用Eloquent在JSON字段中搜索,但现在可以搜索到0个结果。

这是针对运行PostgresSQL,Laravel 5.8和Apache 2的Ubuntu服务器的。

[{
    "value": "1",
    "label": "numero"
},{
    "value": "2016",
    "label": "anio"
},{
    "value": "Acer",
    "label": "especie"
},{
    "value": "2",
    "label": "cant_plantar"
}]
PlanificacionInfo::select('datos_complementarios')->WhereJsonContains('datos_complementarios', ["value" => "Escamonda 2019"]);

查询返回空

2 个答案:

答案 0 :(得分:0)

您是否在->whereJsonContains中用小写的“ w”进行了尝试?像这样:

PlanificacionInfo::select('datos_complementarios')
    ->whereJsonContains('datos_complementarios', ["value" => "Escamonda 2019"]);

documentation中,您可能需要执行以下操作:

$users = PlanificacionInfo::select('datos_complementarios')
        ->whereJsonContains('datos_complementarios->value', 'YOUR SEARCH TERM HERE')
        ->get();

此外,问题中给出的示例中似乎没有与您的查询匹配的json-数据中是否显示“ Escamonda 2019”?

答案 1 :(得分:0)

PostgreSQL要求对象值必须在数组内:

PlanificacionInfo::select('datos_complementarios')
    ->whereJsonContains('datos_complementarios', [["value" => "Escamonda 2019"]]);

使用原始表达式进行不区分大小写的搜索:

PlanificacionInfo::select('datos_complementarios')
    ->whereJsonContains(
        DB::raw('lower("datos_complementarios"::text)'),
        [["value" => strtolower("Escamonda 2019")]]
    );