как сортировать сообщения со средним рейтингом в laravel

#php #sql #laravel #eloquent

#php #sql #laravel #красноречивый

Вопрос:

я использую оценочный пакет willvincent для оценки сообщений, он работает нормально, и каждый пост имеет свой рейтинг в таблице рейтингов с каждым идентификатором пользователя, поэтому я работаю над задачей, в которой я хочу сортировать сообщения по их среднему рейтингу,

я создаю необработанный sql, который хорошо работает на phpmyadmin

 SELECT *, AVG(ratings.rating) as average_rating
FROM posts
JOIN ratings ON ratings.rateable_id = posts.id
WHERE posts.user_id='2'
GROUP BY ratings.rateable_id
ORDER BY average_rating desc
 

но я хочу преобразовать его в форму laravel eloquent builder, я достигаю этого до сих пор

 $postList->leftJoin('ratings', 'ratings.rateable_id', '=', 'posts.id')
            ->select(array('posts.*',
                DB::raw('AVG(rating) as ratings_average')   
                ))
            ->groupBy('posts.id')
            ->where('is_deleted','0')   
            ->orderBy('ratings_average', 'DESC')
            ->get();
 

где в $PostList есть все сообщения с идентификатором пользователя, но не указаны все данные из онлайн-идентификатора таблицы сообщений со средним рейтингом, пожалуйста, помогите

Ответ №1:

Когда вы сталкиваетесь с попыткой преобразовать SQL-запрос в конструктор запросов laravel, всегда проверяйте, что ->toSql() возвращает. Вы можете сделать это, просто используя dd or dump ( dd($postList->.....->orderBy(...)->toSql()) ) в вашем контроллере или в консоли.

Запрос в tinker возвращает тот же SQL из вопроса

 DB::connection('mysql')
  ->table('posts')
  ->selectRaw('*, avg(ratings.rating) as average_rating')
  ->join('ratings', 'ratings.rateable_id', 'posts.id')
  ->where('posts.user_id', '2')
  ->orderBy('ratings.rateable_id')
  ->orderByDesc('average_rating')
  ->get()
 

или, используя модель.

 Posts::query()
  ->selectRaw('*, avg(ratings.rating) as average_rating')
  ->join('ratings', 'ratings.rateable_id', 'posts.id')
  ->where('posts.user_id', '2')
  ->orderBy('ratings.rateable_id')
  ->orderByDesc('average_rating')
  ->get()