Я хочу получить топ-5 категорий по количеству их постов, например:
Cat 1 = 10 posts
Cat 2 = 7 posts
Cat 3 = 5 posts
Cat 4 = 3 posts
Cat 5 = 2 posts
Я знаю, что я могу получить свои категории с их сообщениями за счет активной загрузки и
посчитать количество сообщений каждой категории, но это не дает мне asc
порядок в категориях, так что я думал о соединении запроса.
вот что я сделал до сих пор, и это имеет проблемы
- Я не могу поставить статус сообщений (просто получить посты с опубликованным статусом и считать их только)
Я получаю эту ошибку
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'publish' in where clause is ambiguous (SQL: select * from
категории inner join
сообщений on
1020 * сообщений * категории =
категории .
ID where
1024 * публиковать *
код
$categoriesbyposts = Category::where('publish', '=', 1)
->join('posts', 'posts.categories', '=', 'categories.id')
// ->where('posts.publish', '=', 1)
->take(5)
->get();
PS: Я мог бы упомянуть, что в моей таблице сообщений нет столбца category_id
. Я использую третью таблицу с именем post_categories
, и он получает post_id
и category_id
.
Есть идеи?
Обновление
post model
public function categories(){
return $this->belongsToMany(Category::class, 'post_categories', 'post_id', 'category_id');
}
category model
public function posts(){
return $this->belongsToMany(Post::class, 'post_categories');
}
Обновление 2
Я получил код ниже и он возвращает мне 5 сообщений вместо 5 категорий!
$categoriesbyposts = DB::table('categories')
->where('categories.publish', '=', 1)
->join('post_categories', 'post_categories.category_id', '=', 'categories.id')
->join('posts', 'posts.id', '=', 'post_categories.post_id')
->groupby('categories.id')
->take(5)
->get();