root09
@root09

Laravel подсчет новостей в выбранной категории (включая подкатегории)?

Здравствуйте, ни как не могу понять, как через ORM реализовать получение количества объявлений в выбранной категории (включая подкатегории):
Есть категории и подкатегории, например:
Авто
-bwm
-audi
Мото
-irbis
-polaris
есть таблица posts с объявлениями
так же есть таблица posts_categories
вида:
post_id | categories_id
ну и таблица с категориями categories
id | name | parent

подскажите пожалуйста как через ORM реализовать получение количества объявлений в выбранной категории (включая подкатегории)? например получить количество объявлений в категории Авто (посчитать число объявлений из подкатегории bwm и audi)

У меня есть только идея сначала получить список всех подкатегорий например так:
$categories = Categories::where('parent', '=', $id)->get();

А затем через цикл посчитать количество новостей в каждой категории, но ведь это не совсем правильно?

т.е если это сделать просто на MYSQL запросах, то должно быть что то вида:

SELECT * FROM categories WHERE parent = '1'; // получаем список дочерних категорий (например получили id 2,3,4)
далее
считаем сколько постов у дочерних элементов, например:
SELECT COUNT(*) FROM post_categories WHERE categories_id = 2;
SELECT COUNT(*) FROM post_categories WHERE categories_id = 3;
SELECT COUNT(*) FROM post_categories WHERE categories_id = 4;

и нужно сложить результат этих 3 запросов
  • Вопрос задан
  • 1852 просмотра
Пригласить эксперта
Ответы на вопрос 3
@halenharper
На скорую руку, если я правильно понял, вывод на сайт:
@foreach(Categories::all() as $category)
{{ $category->name }} <span class="badge">{{ Post_categories::where('categories_id', $category->id)->count() }}</span>
@endif

Как модели построены?

UPD
Модель для категорий:
class Categories extends Model {

    public function posts()
    {
//Получаем множество постов, опубликованных в категории
        return $this->hasMany('App\PostCategories', 'categories_id', 'id');
    }

}


В контроллеле:
public function index(){
//Получаем коллекцию категорий, где есть посты. Есть постов в категории нет, то ее не будет в выборке.
        $categories = Categories::has('posts')->get();
        return view('index', compact('categories'));
    }


Во вьюхе:
@foreach($categories as $category)
{{ $category->name }} <span class="badge">{{ $category->posts->count() }}</span>
@endif
Ответ написан
@eskrano
Мне кажется что можно сделать Categories hasOne() к родительской категории и через жадную загрузку подсчитать как вариант. Или я не правильно понял суть вопроса
Ответ написан
Комментировать
Tesla
@Tesla
Похоже, вы просто не знаете, что в SQL кроме оператора '=' есть еще оператор 'IN'. Это чтобы 3 запроса в один объединить :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы