Получить категории упорядочить по их сообщениям в laravel - PullRequest
0 голосов
/ 27 октября 2018

Я хочу получить топ-5 категорий по количеству их постов, например:

Cat 1 = 10 posts
Cat 2 = 7 posts
Cat 3 = 5 posts
Cat 4 = 3 posts
Cat 5 = 2 posts

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

вот что я сделал до сих пор, и это имеет проблемы

  1. Я не могу поставить статус сообщений (просто получить посты с опубликованным статусом и считать их только)
  2. Я получаю эту ошибку

    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();

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

пожалуйста, добавьте имя таблицы, в которой условие, к какой таблице применяется это условие

выберите * из категорий сообщений внутреннего объединения на posts.categories = Categories.id, где category.publish = 1 предел 5)

0 голосов
/ 27 октября 2018

Попробуйте и дайте мне знать, каковы результаты

$results = DB::select('
    SELECT c.category_name, c.slug, COUNT(pc.post_id) AS `post_count`
    FROM categories AS c JOIN post_categories AS pc
    ON c.id = pc.category_id
    JOIN posts AS p
    ON posts.id = post_categories.post_id
    WHERE c.publish = 1 AND p.publish = 1
    GROUP BY category_name
    ORDER BY post_count DESC
    LIMIT 5
');

Другой альтернативой будет

$results = Category::selectRaw('categories.category_name, categories.slug,  COUNT(post_categories.post_id) AS `post_count`')
            ->join('post_categories', 'categories.id', '=', 'post_categories.category_id')
            ->join('posts', 'posts.id', '=', 'post_categories.post_id')
            ->whereRaw('categories.publish = 1 AND posts.publish = 1')
            ->groupBy('category_name')
            ->orderBy('post_count', 'DESC')
            ->limit(5)
            ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...