2015-09-06 2 views
0

Я добавляю несколько моделей и один контроллер.Laravel5.1 eloquent slow action

Контроллер

Форум:

public function showCategory($alias) 
{ 
    $page_title = trans('forum.forum').' :: '.trans('static.website_title'); 

    $category_info = ForumCategory::where('category_alias', $alias)->first(); 

    return view('layout.pages.forum.category', compact('category_info')); 
} 

Модели

ForumCategory

public function threads() 
{ 
    return $this->hasMany('App\Forum\ForumThread', 'category_id'); 
} 

ForumThread

public function posts() 
{ 
    return $this->hasMany('App\Forum\ForumPost', 'thread_id'); 
} 

category.blade.php:

@extends('layout.default') 

@section('content') 

{{ $category_info->category_alias }} 

{{--*/ $ThreadList = $category_info->threads()->paginate(20) /*--}} 

    @foreach($ThreadList as $thread) 
    {{--*/ $a = $thread->posts->count() /*--}} 
     <a href="{{URL::to('/forum', array($category_info->category_alias, $thread->thread_alias))}}">{{ $thread->thread_id }} - {{ $thread->thread_subject }} - {{ $a }}</a><br /><br /> 
    @endforeach 
@stop 

Page время рендеринга: ~ 0.701548814774 секунд. На мой взгляд, я думаю, что это очень медленно ... Как я могу это ускорить?

+1

Установите https://github.com/barryvdh/laravel-debugbar на dev, чтобы вы знали, почему это медленно. – ceejayoz

ответ

1

Я предполагаю, что вы хотите выполнить весь код, указанный в примере, включая прокомментированные строки. Я думаю, что вы ищете Eager Loading.

Его можно легко использовать, чтобы избежать проблем с N + 1 и улучшить производительность.

Вы должны использовать что-то вроде:

ForumCategory::with('threads')->where('category_alias', $alias)->first(); 

Кроме того, вы можете указать вложенные отношения.

ForumCategory::with('threads.posts')->where('category_alias', $alias)->first(); 

Подробнее here! Пример документации очень прост для понимания!

Кроме того, было бы полезно профилировать ваши заявки с использованием профилировщика. Их много, barryvdh/laravel-debugbar - один из них.

+0

У меня более 30 000 сообщений для одной темы. Я отредактировал таблицу потоков и добавил thread_replay и изменил в категории.blade.php для этого: ** $ a = $ thread-> thread_reply + 1 ** – Pionas

+0

Очевидно, вы можете использовать [Eager Load constraination] (http://laravel.com) /docs/5.1/eloquent-relationships#constraining-eager-loads), чтобы выполнить свою работу и выбрать только определенный набор потоков. Это то же самое синтаксис :) –

+0

Если вы хотите «сохранить» (а затем получить) информацию о метаданных о ваших потоках, вы можете отредактировать модель ForumThread и добавить аксессуар с именем «posts_count», который подсчитывает общее количество сообщений:). Посмотрите [здесь] (http://laravel.com/docs/5.1/eloquent-mutators#accessors-and-mutators). –

Смежные вопросы