Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени суток.
Суть проблемы такова:
Использую Laravel 4
Имеются две таблицы: Categories и Posts. Таблицы связаны между собой, т.е. все работает как надо, на страницах отлично выводятся посты и названия категорий, соответствующих постам.
Структура Категорий:
id, category (то бишь название), и таймстампы.
Структура Постов:
id, title, postmini, post, category_id, и таймстампы.
Хотел бы спросить знающих, как с использованием Eloquent подсчитать количество новостей в каждой категории, чтобы вывести их в виде Название категории (кол-во постов).
Примерно так:
Первая категория (15)
Вторая категория (12)
Третья категория (17)
Спасибо.
Не в сети
Не в сети
join уже включен, при создании Отношений.
Думаю, должно быть что-то похожее на (так, навскидку):
$categories = Category::with('post')->get(); // собрали все названия категорий
foreach ($categories as $category)
{
echo $category->category // здесь выводится название категории
' . (' // здесь лепим скобку '(' дизайна
count ((Category::with('post')->where('category', '=', $category->category)->get())) // здесь выводим кол-во новостей в категории
.')'; // Здесь лепим закрывающую скобку ')' дизайна
}
На выходе должно получиться что-то типа:
Первая категория (15)
Вторая категория (20)
и т.д.
как я уже и писал.
То бишь, сначала соберем все названия категорий, а затем в цикле выводим названия категории и кол-во новостей в ней
Либо вместо get () в цикле использовать count ().... Только как посчитать то, что именно надо?....
Изменено zombie_squad (07.02.2014 22:12:17)
Не в сети
Мой код не работает? Задача — получить SQL наподобие:
sqlSELECT categories.*, COUNT(1) AS count FROM categories JOIN posts ON category_id = categories.id GROUP BY categories.id ORDER BY `count`, DESC
В итоге получится 1 запись на каждую категорию (запись в categories); запись будет содержать стандартные для categories поля, а также поле count, которое будет содержать число постов в этой категории (записей в posts с category_id = posts.id). ORDER BY можно убрать, если не нужно.
Не в сети
ваш код не проверял, так как хотелось бы тоже самое, но с использованием Eloquent (туплю я с ним).
спасибо за подсказку, буду пробовать, как появится время, потом отпишусь.
Не в сети
так-c? По первому коду вылетает ошибка:
Argument 1 passed to Illuminate\Database\Grammar::columnize() must be an array, string given, called in /var/www/guestbook.dev/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php on line 112 and defined
со вторым запросом даже phpmyadmin не справился. ошибка USE NEAR. Порядок неправильный.
сейчас буду долбать код... вроде выход находится постепенно.
Не в сети
Точно, перед DESC запятая же стоит... Вот и ошибка.
Не в сети
в общем...использовал ваш первый код, только в таком виде
SELECT categories.*, COUNT(1) AS count FROM categories JOIN posts ON category_id = categories.id GROUP BY categories.id
и пришел к такому виду в Laravel
$catpostsnum = DB::table('categories')->join('posts', 'category_id', '=', 'categories.id')->groupBy('categories.id')->select(DB::raw('count(1) AS count'))->get();
все работает.
однако тут же появилась другая проблема, как заставить все выводиться в цикле, как мне нужно.
$category = Category::all();
$nums = DB::table('categories')->join('posts', 'category_id', '=', 'categories.id')->groupBy('categories.id')->select(DB::raw('count(1) AS count'))->get();
foreach ($category as $cat)
{
echo $cat->category;
}
foreach ($nums as $num)
{
echo $num->count;
}
как вы поняли, выводится все в виде:
Первая категория
Вторая категория
(2)
(3)
вот теперь думаю, как foreach вложить в foreach. вроде такого еще не видел. нет никаких мыслей?
или из запроса с количеством новостей можно как-то и названия вырезать? просто в phphmyadmin при запросе
SELECT categories.*, COUNT(1) AS count FROM categories JOIN posts ON category_id = categories.id GROUP BY categories.id
имеется оба нужных поля Category и Count.
Не в сети
Не в сети
так я и понял, что все должно быть ок. Но
dd($nums);
дает:
array(2) {
[0]=>
object(stdClass)#179 (1) {
["count"]=>
string(1) "2"
}
[1]=>
object(stdClass)#180 (1) {
["count"]=>
string(1) "3"
}
}
т.е. нет тут поля category? только count осталось. я что-то упустил? или туплю?
Изменено zombie_squad (08.02.2014 02:38:45)
Не в сети
Не в сети
Страницы 1