#php #sql #laravel
#php #sql #laravel
Вопрос:
return $this
->restaurant
->select('restaurants.*')
->selectRaw('COALESCE(ROUND(AVG(reviews.rating),1), 0) as average_rating')
->leftJoin('reviews', 'reviews.restaurant_id', '=', 'restaurants.id')
->when($user_id, function($query, $user_id){
$query->where("restaurants.user_id", $user_id);
})
->groupBy('restaurants.id')
->when($request->from_rating, function($query, $from_rating){
$query->having('average_rating', '>=', $from_rating);
})
->when($request->to_rating, function($query, $to_rating){
$query->having('average_rating', '<=', $to_rating);
})->orderByDesc("average_rating")
->paginate(
$this->perPage,
['id', 'name', 'image', 'description', 'filesystem', 'created_at'],
'page',
$request->page
);
Это запрос, с которым я столкнулся. Наконец. Я заставил это работать, но теперь проблема в том, посмотрите на следующую строку,
$query->having('average_rating', '>=', $from_rating);
Это выдает ошибку: unknown column average_rating
. Я понятия не имею, почему. У меня есть этот столбец в select выше.
Я также преобразовал это в инструкцию SQL, используя функцию toSql ().
Результат:
select
`restaurants`.*,
COALESCE(ROUND(AVG(reviews.rating),1), 0) as average_rating
from
`restaurants`
left join `reviews` on `reviews`.`restaurant_id` = `restaurants`.`id`
group by `restaurants`.`id`
having `average_rating` >= ? and `average_rating` <= ?
order by `average_rating` desc
Комментарии:
1. Можете ли вы включить остальную часть трассировки стека для этой ошибки?
Ответ №1:
Псевдонимы столбцов, которые определены в SELECT
предложении, не разрешены в HAVING
предложении. Это связано с порядком, в котором СУБД оценивает разные части запроса: HAVING
предложение вычисляется перед SELECT
предложением, в отличие, например, от ORDER BY
предложения, которое обрабатывается позже (и, следовательно, принимает псевдонимы столбцов)
Вам нужно было бы изменить эту часть вашего запроса:
$query->having('average_rating', '>=', $from_rating);
Для:
$query->having('COALESCE(ROUND(AVG(reviews.rating),1), 0)', '>=', $from_rating);
Комментарии:
1. Если они не разрешены, то почему это работает в обычном mysql?
2. выберите
restaurants
.*, ОБЪЕДИНИТЬ (ОКРУГЛИТЬ (СРЕДНЕЕ значение (отзывы.рейтинг), 1), 0) в качестве average_rating отrestaurants
левого объединенияreviews
наreviews
.restaurant_id
=restaurants
.id
группировать поrestaurants
.id
наличиеaverage_rating
>= 3 иaverage_rating
<= 7 в порядкеaverage_rating
desc3. Я прокомментировал sql-запрос. это работает в обычном sql. итак, ваш ответ кажется неправильным.