Você precisa remapear sua matriz e inicializar uma matriz para a chave de direitos ... então, altere seu loop while para algo assim:
$json_response = array();
while($row = $result->fetch_assoc()) {
if (!isset($json_response[ $row['idCategory'] ])) {
$json_response[ $row['idCategory'] ] = [
'idCategory' => $row['idCategory'],
'nameCategory' => $row['nameCategory'],
'rights' => [],
];
}
$json_response[ $row['idCategory'] ]['rights'][] = [
'idRight' => $row['rid'],
'name' => $row['rname'],
'price' => $row['price'],
'image' => $row['rimg']
];
}
// We want the final result to ignore the keys and to create a JSON array not a JSON object
$data = [];
foreach ($json_response as $element) {
$data[] = $element;
}
echo json_encode($data);
Esta parte do código
$json_response[ $row_array['idCategory'] ]
ajuda a manter um agrupamento exclusivo dos dados porque cria um hash com base no idCategory. Um array pode ter apenas uma chave e como idCategory é sempre único, podemos usá-lo como chave para agrupamento. quando for convertido para JSON. Você não deseja usar GROUP BY ou GROUP_CONCAT nesta situação.