Laravel返回餐馆的平均费用

时间:2019-03-29 21:48:17

标签: laravel

<?php

$query = $this->restaurant->leftJoin('reviews', 'reviews.restaurant_id', '=', 'restaurants.id');
$query = $user_id == null ? $query : $query->where("user_id", $user_id);

$query = $query->select('restaurants.*')
    ->selectRaw('ROUND(AVG(reviews.rating), 1) as average_rating')
    ->groupBy('restaurants.id')
    ->havingRaw('AVG(reviews.rating) >= ?', [$request->from_rating])
    ->havingRaw('AVG(reviews.rating) <= ?', [$request->to_rating])
    ->orderByDesc("average_rating")
    ->paginate(
        $this->perPage,
        ['id', 'name', 'image', 'description', 'filesystem', 'created_at'],
        'page',
        $request->page
    );

return $query;

我的查询如下所示。我有两个表:餐厅和评论。评论表存储restaurant_id。例如,当我们有10家餐厅,而我们只有1家餐厅有1条评论时,就会出现问题。运行此查询后,仅返回1家餐厅,因为我使用了havingRaw,它会根据平均评分过滤“餐厅”。因此,如果餐厅没有任何评分,则不会退还该餐厅。 我该如何使所有餐厅仍然返回,但它们的平均评分变为0?

1 个答案:

答案 0 :(得分:0)

您可以使用CASE WHEN来填充具有特定条件的mysql。另外,您也可以将“评级”表的数据类型更改为int(5),在这种情况下,所有空值都将显示为0。这样就可以根据您的问题进行操作了。