@photosho

Как оптимизировать обращения к базе данных?

Всем привет. Есть такая ситуация: нужно вывести страницу со списком статей, причем статей на этой странице довольно много, в пределах 20. Считываю их все из базы данных. Допустим, так:

Post::orderBy('id', 'desc')->take(20)->get();

Далее, в этом же списке, надо вывести количество комментариев для каждой статьи. Получается, в foreach по каждой статье еще выполнять запрос на получение количества комментариев для нее. На 20 статей - это еще 20 запросов. Как-то многовато. Есть ли варианты минимизировать число запросов?

Читал про "жадную загрузку", но это, вроде, не тот случай...
  • Вопрос задан
  • 739 просмотров
Решения вопроса 1
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.
Жадная загрузка.
Post::with('commentsCount')->get();

В модели что-то вроде:
public function commentsCount()
		{
		  return $this->comments()
		    ->selectRaw('count(id) as aggregate')
		    ->groupBy('id');
		}
		public function getCommentsCountAttribute()
		{
		  if ( ! array_key_exists('commentsCount', $this->relations))
		    $this->load('commentsCount');

		  $related = $this->getRelation('commentsCount')->first();

		  return ($related) ? (int) $related->aggregate : 0;
		}


В каждом посте будет аттрибут "commentsCount" с количеством комментариев.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
DJZT
@DJZT
Laravel - code for you
Post::with('comments')->get()
У вас получится всего два запроса. И юзайте на здоровье count()
Ответ написан
dima9595
@dima9595
Junior PHP
Не знаю точно, но попробуйте использовать "Активную загрузку".
Laravel 4: https://laravel.ru/docs/v4/eloquent#активная
Laravel 5: https://laravel.ru/docs/v5/eloquent#активная
Ответ написан
astralo
@astralo
для "спасибо" есть кнопка [Нравится]
Делать составной запрос. Или сначала поствы, потом брать ид статей через lists и запрос на комменты
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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