sql json форматирование и суммирование - PullRequest
0 голосов
/ 02 ноября 2018

Итак, в основном у меня есть функция, которая возвращает мне данные 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\")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...