从数据库中选择json数据时,我遇到了一个问题。 有没有一种方法可以按索引提取数据索引。
我需要这个,因为我想对json项的名称进行求和和分组,如果我使用以下方法从数组中提取第一个项,则可以实现此目的:
DB::raw('JSON_UNQUOTE(JSON_EXTRACT(resources, "$[0].name[0]")) as brand_name'),
DB::raw('JSON_UNQUOTE(JSON_EXTRACT(resources, "$[0].brand_id[0]")) as brand_id'),
DB::raw('SUM(JSON_EXTRACT(resources, "$[0].quantity[0]")) as quantity')
然后我将$ [0] .name [0]分组,得到唯一的结果。
存储在sql中的数据:
[[{\"name\": \"Product 1\", \"brand_id\": \"2\", \"quantity\": 2},
{\"name\": \"Product 2\", \"brand_id\": \"3\", \"quantity\": 1}],
[{\"name\": \"Product 3\", \"brand_id\": \"1\", \"quantity\": 2},
{\"name\": \"Product 1\", \"brand_id\": \"2\", \"quantity\": 5}],
[{\"name\": \"Product 4\", \"brand_id\": \"4\", \"quantity\": 2},
{\"name\": \"Product 5\", \"brand_id\": \"5\", \"quantity\": 5}]]
如果您理解我的意思,我应该对所有具有相同名称的产品的数量求和,并获得唯一的响应,而不是多个具有相同名称的产品。 例如,应该只有一个
产品1,总数量为7。
答案 0 :(得分:0)
假设您可以获取原始的JSON字符串:
$rawjson = '[[{\"name\":\"Product 1\",\"brand_id\": \"2\",\"quantity\": 2},{\"name\":\"Product 2\",\"brand_id\": \"3\",\"quantity\": 1}],[{\"name\": \"Product 3\", \"brand_id\": \"1\",\"quantity\": 2},{\"name\": \"Product 1\", \"brand_id\": \"2\", \"quantity\": 5}],[{\"name\": \"Product 4\", \"brand_id\": \"4\",\"quantity\": 2},{\"name\": \"Product 5\", \"brand_id\": \"5\",\"quantity\": 5}]]';
$master = json_decode(stripslashes($rawjson), true);
$p1Sum = 0;
$p2Sum = 0;
$p3Sum = 0;
$p4Sum = 0;
foreach ($master as $subitems) {
foreach ($subitems as $item) {
$itemName = $item['name'];
switch($itemName){
case 'Product 1':
$p1Sum += $item['quantity'];
break;
case 'Product 2':
$p2Sum += $item['quantity'];
break;
case 'Product 3':
$p3Sum += $item['quantity'];
break;
case 'Product 4':
$p4Sum += $item['quantity'];
break;
}
}
}
echo 'Product 1: ' . $p1Sum . "\r\n";
echo 'Product 2: ' . $p2Sum . "\r\n";
echo 'Product 3: ' . $p3Sum . "\r\n";
echo 'Product 4: ' . $p4Sum . "\r\n";
会给你:
Product 1: 7
Product 2: 1
Product 3: 2
Product 4: 2