2014-10-07 3 views
0

Я успешно запрашиваю следующее и создаю 130 запросов, я хочу оптимизировать его и уменьшить количество запросов, я установил модель и контроллеры следующим образом.Laravel: Улучшенный сводный запрос

Сообщение Модальные

class Post extends Eloquent { 
    public function Categories() { 
     return $this->belongsToMany('Category', 'category_post'); 
    } 
} 

Категория Модальные

class Category extends Eloquent { 
    public function posts() { 
     return $this->belongsToMany('Post', 'category_post'); 
    } 
} 

и в контроллере, я использую следующий запрос, то, что следующий запрос делает, запрашивая результаты, основанные на идентификатор категории ,

$category = Category::with('posts')->where('id','=',$id)->paginate(10)->first(); 
return Response::json(array('category' => $category)); 

Если кто-нибудь может дать мне руку для оптимизации запроса, было бы действительно замечательно.

ответ

0

Вы ошибаетесь, это не создает 130 запросов.

Это создаст следующие 3 запросов:

select count(*) as aggregate from `categories` where `id` = '5'; 
select * from `categories` where `id` = '5' limit 10 offset 0; 
select `posts`.*, `posts_categories`.`category_id` as `pivot_category_id`, `posts_categories`.`post_id` as `pivot_post_id` from `posts` inner join `posts_categories` on `posts`.`id` = `posts_categories`.`post_id` where `posts_categories`.`category_id` in ('5'); 

Но вопрос в том, что именно вы хотите постраничной. Теперь вы разбиваете категории на категории, и это не имеет большого смысла, потому что есть только одна категория с выбранными $id.

То, что вы, вероятно, хотите, чтобы получить это:

$category = Category::where('id','=',$id)->first(); 
$posts = $category->posts()->paginate(10); 

и это будет снова создать 3 запросы:

select * from `categories` where `id` = '5' limit 1; 
select count(*) as aggregate from `posts` inner join `posts_categories` on `posts`.`id` = `posts_categories`.`post_id` where `posts_categories`.`category_id` = '5'; 
select `posts`.*, `posts_categories`.`category_id` as `pivot_category_id`, `posts_categories`.`post_id` as `pivot_post_id` from `posts` inner join `posts_categories` on `posts`.`id` = `posts_categories`.`post_id` where `posts_categories`.`category_id` = '5' limit 10 offset 0; 

Если вы хотите улучшить его, вы, вероятно, нужно не использовать красноречивый в этом случае и использовать join - но стоит ли? Теперь вам нужно будет вручную вывести на экран результаты без paginate(), поэтому, вероятно, вы не захотите этого достичь.

EDIT

То, что вы, вероятно, сделать это:

  1. вы получите все сообщения, которые принадлежат к категории (но на самом деле вы хотите постраничной только 10 из них)
  2. для каждого вы хотите показать все категории, к которым он принадлежит.

Чтобы снизить число запросов, вы должны использовать:

$category = Category::where('id','=',$id)->first(); 
$posts = $category->posts()->with('categories')->paginate(10); 

и отобразить его следует использовать:

foreach ($posts as $p) { 

    echo $p->name.' '."<br />"; 
    foreach ($p->categories as $c) { 
     echo $c->name."<br />"; 
    } 
} 

Это должно снизить число запросов к 4 из 130

+0

Я получаю следующее сообщение! [Введите описание изображения здесь] [1] [1]: h ttp: //i.stack.imgur.com/T7CW4.png – Yoosuf

+0

@Yoosuf И только 3 первых из них связаны с выше.Вы должны посмотреть на остальную часть своего кода, что еще вы делаете, потому что другие запросы, вероятно, выполняются каким-то другим кодом. Вы также можете показать больше кода (отредактируйте свой вопрос), чтобы показать это. Вы показываете категории для каждого из своих сообщений? Как я показал вам, первая проблема связана с разбивкой по страницам, вы не принимаете 10 записей, но все они (возможно, у вас есть 100 сообщений) –

+0

@Yoosuf Я отредактировал свой ответ –

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