Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 06.02.2014 23:51:18

Подсчитать количество новостей в категории

Доброго времени суток.
Суть проблемы такова:
Использую Laravel 4
Имеются две таблицы: Categories и Posts. Таблицы связаны между собой, т.е. все работает как надо, на страницах отлично выводятся посты и названия категорий, соответствующих постам.
Структура Категорий:

id, category (то бишь название), и таймстампы.

Структура Постов:

id, title, postmini, post, category_id, и таймстампы.

Хотел бы спросить знающих, как с использованием Eloquent подсчитать количество новостей в каждой категории, чтобы вывести их в виде Название категории (кол-во постов).
Примерно так:

Первая категория (15)
Вторая категория (12)
Третья категория (17)

Спасибо.

Не в сети

#2 07.02.2014 00:02:28

Re: Подсчитать количество новостей в категории

PHP
Category
  
::join('posts''categories.id''=''category_id')
  ->
groupBy('category_id')
  ->
get('*'DB::raw('COUNT(1)'));

Возможно, нужна корректировка, но идея такая.

Не в сети

#3 07.02.2014 22:10:00

Re: Подсчитать количество новостей в категории

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)

Не в сети

#4 07.02.2014 22:58:02

Re: Подсчитать количество новостей в категории

Мой код не работает? Задача — получить 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 можно убрать, если не нужно.

Не в сети

#5 07.02.2014 23:46:10

Re: Подсчитать количество новостей в категории

ваш код не проверял, так как хотелось бы тоже самое, но с использованием Eloquent (туплю я с ним).
спасибо за подсказку, буду пробовать, как появится время, потом отпишусь.

Не в сети

#6 08.02.2014 00:00:39

Re: Подсчитать количество новостей в категории

так-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. Порядок неправильный.

сейчас буду долбать код... вроде выход находится постепенно.

Не в сети

#7 08.02.2014 00:02:28

Re: Подсчитать количество новостей в категории

Точно, перед DESC запятая же стоит... Вот и ошибка.

Не в сети

#8 08.02.2014 01:08:29

Re: Подсчитать количество новостей в категории

в общем...использовал ваш первый код, только в таком виде

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.

Не в сети

#9 08.02.2014 02:19:10

Re: Подсчитать количество новостей в категории

  1. и пришел к такому виду в Laravel

Всё верно, фактически это мой код в одну строку. Тот же Eloquent.

  1. просто в phphmyadmin при запросе имеется оба нужных поля Category и Count.

Конечно имеются. Сравни мой код в первом посте и свой, в одну строку.

Не в сети

#10 08.02.2014 02:37:20

Re: Подсчитать количество новостей в категории

так я и понял, что все должно быть ок. Но

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)

Не в сети

#11 08.02.2014 02:43:53

Re: Подсчитать количество новостей в категории

Сравни мой код и свой. Весьма поможет, если развернёшь его на несколько строк.

Не в сети

Подвал раздела