#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())
) в вашем контроллере или в консоли.
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()