Итак, в основном у меня есть функция, которая возвращает мне данные json из базы данных в следующем формате:
"meanings": [
"[
{\"name\": \"Product 1\", \"product_id\": \"1\", \"quantity\": 4},
{\"name\": \"Product 1\", \"product_id\": \"1\", \"quantity\": 1},
{\"name\": \"Product 1\", \"product_id\": \"1\", \"quantity\": 1},
{\"name\": \"Product 1\", \"product_id\": \"1\", \"quantity\": 4},
{\"name\": \"Product 2\", \"product_id\": \"2\", \"quantity\": 4},
{\"name\": \"Product 3\", \"product_id\": \"3\", \"quantity\": 4},
{\"na]"
]
Я хочу добиться суммирования количества всех продуктов с одинаковым идентификатором бренда и получить следующий результат:
"meanings": [
"[
{\"name\": \"Product 1\", \"product_id\": \"1\", \"quantity\": 10},
{\"name\": \"Product 2\", \"product_id\": \"2\", \"quantity\": 4},
{\"name\": \"Product 3\", \"product_id\": \"3\", \"quantity\": 4},
{\"na]"
]
Я добился этого, написав следующее: чистый php, он делает то, что я хочу, но проблема в том, что это API.
Многократно звонить по этому номеру - не самая лучшая вещь, и в конечном итоге это вызовет проблемы.
$data = [];
$pId = [];
$objects = $this->reports()->getBasicMeans($this->id)->get();
foreach($objects as $object)
{
$newData = json_decode($object);
$data[$newData->product_id]['name'] = $newData->name;
$data[$newData->product_id]['product_id'] = $newData->product_id;
if (!in_array($newData->product_id, $pId)) {
$pId[] = $newData->product_id;
$data[$newData->product_id]['quantity'] = $newData->quantity;
} else {
$data[$newData->product_id]['quantity'] += $newData->quantity;
}
}
$json['meanings'] = json_encode($data);
Это запрос, который возвращает мне JSON. Был бы способ изменить запрос, который получит желаемые результаты без использования php-функций для достижения этой цели?
/**
* Get basic means for the specified object.
*
* @param [type] $query
* @param [type] $object
* @return void
*/
public function scopegetBasicMeans($query, $object = null)
{
$query->where('object_id', $object)->where('type', 1)
->join('report_asset', 'report_asset.report_id', '=', 'reports.id')->select(
DB::raw(
'SUM(JSON_EXTRACT(report_asset.resources, "$.quantity")) as amount'
)
)->groupBy(DB::raw('JSON_EXTRACT(report_asset.resources, "$.name")'));
}
Я использую mysql 5.7
QUERY:
select SUM(JSON_EXTRACT(report_asset.resources, \"$.quantity\")) as amount from `reports` inner join `report_asset` on `report_asset`.`report_id` = `reports`.`id` where `reports`.`object_id` = ? and `reports`.`object_id` is not null and `object_id` = ? and `type` = ? and `reports`.`deleted_at` is null group by JSON_EXTRACT(report_asset.resources, \"$.name\")