I created a custom api to get review and rating summary:
public function getRatingSummary($productId)
{
$result =[];
$product = $this->_productRepository->getById($productId);
$idArray = [$productId];
$reviewsCollection = $this->_reviewCollectionFactory->create()
->addFieldToFilter('entity_pk_value',array("in" => $idArray))
->addStatusFilter(MagentoReviewModelReview::STATUS_APPROVED)
->addRateVotes();
$ratingSummary = $reviewsCollection->getSelect();
$starsData = array();
foreach ($reviewsCollection->getItems() as $review) {
foreach( $review->getRatingVotes() as $_vote ) {
$rating = [];
$percent = $_vote->getPercent();
$star = ($percent/20);
$productId = $_vote->getEntityPkValue();
$countReview = $this->_reviewFactoryCustom->create()->getTotalReviews($productId,false);
$review_id = $_vote->getReviewId();
$rating_id = $_vote->getRatingId();
$rating['rating_id'] = $rating_id;
$rating['review_id'] = $review_id;
$rating['product_id'] = $productId;
$rating['percent'] = $percent;
$rating['star'] = $star;
$rating['nickname'] = $review->getNickname();
$items[] = $rating;
$starData[$star][] = $rating;
$starsData[] = $rating;
}
}
if(count($items) > 0) {
$results['all'] = $items;
$result[1]['star'] = $starsData;
if(isset($starData[1]))
$result[2]['count'][1] = count($starData[1]);
else
$result[2]['count'][1] = 0;
if(isset($starData[2]))
$result[2]['count'][2] = count($starData[2]);
else
$result[2]['count'][2] = 0;
if(isset($starData[3]))
$result[2]['count'][3] = count($starData[3]);
else
$result[2]['count'][3] = 0;
if(isset($starData[4]))
$result[2]['count'][4] = count($starData[4]);
else
$result[2]['count'][4] = 0;
if(isset($starData[5]))
$result[2]['count'][5] = count($starData[5]);
else
$result[2]['count'][5] = 0;
$sum = $startSum = 0;
foreach($result[2]['count'] as $number => $count) {
$sum += $number * $count;
$startSum += $count;
}
$avg = $sum/$startSum;
$result [3]['rating']['all'] = count($results['all']);
$result [3]['rating']['avg'] = round($avg,1);
}
return $result;
}
But the response I get is :
[
{
"star": [
{
"rating_id": "1",
"review_id": "3",
"product_id": "9",
"percent": "100",
"star": 5,
"nickname": "XXXXX"
},
{
"rating_id": "3",
"review_id": "3",
"product_id": "9",
"percent": "60",
"star": 3,
"nickname": "XXXXX"
},
{
"rating_id": "2",
"review_id": "3",
"product_id": "9",
"percent": "100",
"star": 5,
"nickname": "XXXXX"
},
{
"rating_id": "1",
"review_id": "4",
"product_id": "9",
"percent": "40",
"star": 2,
"nickname": "YYYY"
},
{
"rating_id": "3",
"review_id": "4",
"product_id": "9",
"percent": "80",
"star": 4,
"nickname": "YYYY"
},
{
"rating_id": "2",
"review_id": "4",
"product_id": "9",
"percent": "80",
"star": 4,
"nickname": "YYYY"
}
]
},
{
"count": {
"1": 0,
"2": 1,
"3": 1,
"4": 2,
"5": 2
}
},
{
"rating": {
"all": 6,
"avg": 3.8
}
}
]
I want my response as an array of same type of object or something like this:
{
"star": [
{
"rating_id": "1",
"review_id": "3",
"product_id": "9",
"percent": "100",
"star": 5,
"nickname": "XXXX"
},
{
"rating_id": "3",
"review_id": "3",
"product_id": "9",
"percent": "60",
"star": 3,
"nickname": "XXXX"
},
{
"rating_id": "2",
"review_id": "3",
"product_id": "9",
"percent": "100",
"star": 5,
"nickname": "XXXX"
},
{
"rating_id": "1",
"review_id": "4",
"product_id": "9",
"percent": "40",
"star": 2,
"nickname": "YYYY"
},
{
"rating_id": "3",
"review_id": "4",
"product_id": "9",
"percent": "80",
"star": 4,
"nickname": "YYYY"
},
{
"rating_id": "2",
"review_id": "4",
"product_id": "9",
"percent": "80",
"star": 4,
"nickname": "YYYY"
}
],
"count": {
"1": 0,
"2": 1,
"3": 1,
"4": 2,
"5": 2
},
"rating": {
"all": 6,
"avg": 3.8
}
}
Can someone please help to achieve the desired output?