postgresql 如何使用Eloquent在包含对象数组的json字段中进行搜索

23c0lvtd  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(4)|浏览(185)

我试图seach在JSON字段与雄辩,但现在的工作,seach与0结果。
这是Ubuntu服务器,运行PostgreSQL,Laravel 5.8和Apache 2。

[{
    "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"]);

查询返回空

0s7z1bwu

0s7z1bwu1#

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")]]
    );
f1tvaqid

f1tvaqid2#

你有没有试过在->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”是否出现在您的数据中?

sz81bmfz

sz81bmfz3#

$departments = Department::whereJsonContains('brands', ["value" => $item->vendor])->get(); //working on my 
//but when doing this:
 $departments = Department::select('brands')->whereJsonContains(DB::raw('lower("brands"::text)'), ["value" => strtolower($item->vendor)])->get(); // does not work
xpcnnkqh

xpcnnkqh4#

你可以先把你的json转换成一个PHP关联数组:

//your json
$raw = '[{
    "value": "1",
    "label": "numero"
},{
    "value": "2016",
    "label": "anio"
},{
    "value": "Acer",
    "label": "especie"
},{
    "value": "2",
    "label": "cant_plantar"
}]';

//convert json to associative array
$decoded = json_decode($raw, true);

下面是一个过滤和查找匹配项函数“value”=>$searchWord

//reusable function

function searchValue($array, $searchWord)
{
  $result = array_filter($array,
    function ($item) use ($searchWord) {
      return $item['value'] == $searchWord;
    }
  );
  return $result;
}

简单地调用你函数:

//the call
$query = searchValue($decoded, "Acer");
var_dump($query);

相关问题