Пользователь SQL не может найти столбец неизвестный столбец

#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 desc

3. Я прокомментировал sql-запрос. это работает в обычном sql. итак, ваш ответ кажется неправильным.