2016-08-23 5 views
0

На моем индексном сайте есть много категорий (Category.php), в которых много советов (Board.php). В Совете может быть много тем (Topic.php), а в теме может быть много ответов (Reply.php).Laravel hasMany количество отношений

Я хочу получить количество ответов текущей платы, возможно, с нетерпением.

У меня есть способ, но он выполняет слишком много запросов. Я создаю атрибут post_count, затем перебираю каждую тему и собираю количество ответов. Есть ли способ выбрать все ответы с текущей платы?

public function getPostCountAttribute() 
{ 
    $count = 0; 
    foreach ($this->topics()->withCount('replies')->get() as $topic) { 
     $count += $topic->replies_count; 
    } 
    return $count; 
} 

ответ

0

Попробуйте

Изменить

$count = 0; 
foreach ($this->topics()->withCount('replies')->get() as $topic) { 
    $count += $topic->replies_count; 
} 

Для

$topic_ids = $this -> topics -> pluck('id'); 
$reply_count = Reply::whereIn('id',$topic_ids) -> count(); 
+0

Не должно WhereIn() имеет два аргумента? Отсутствует аргумент 2 для Illuminate \ Database \ Query \ Builder :: whereIn() .. Я изменил на whereIn ('topic_id', $ topic_ids), никаких результатов. – dinomuharemagic

+0

@core_m. Я обновил. – KmasterYC

+0

Печать и просмотр, если $ themes_ids выдает идентификатор. В коде нет ничего плохого. –

1

Нашли хороший способ. Несмотря на это, я оставлю этот вопрос открытым, если кто-нибудь найдет лучший способ сделать это.

я объявлен hasManyThrough отношения, и называется граф():

Board.php:

public function replies() 
    { 
     return $this->hasManyThrough(Reply::class, Topic::class); 
    } 

И тогда называется:

$board->replies->count() 

30 запросов, выполненных (45 перед тем).

Тем не менее, я хотел бы найти интересный способ загрузить данные, получив номер запроса до 2 или 3 запросов.

1

В дополнение к вашему reply вы можете сделать что-то вроде этого.

public function repliesCount() { 
     return $this->replies()->selectRaw('board_id, count(*) as aggregate') 
         ->groupBy('board_id'); 
    } 

и использовать это использование, как показано ниже

$board->repliesCount() 

Пожалуйста, обратите внимание, что вы должны изменить запрос в соответствии с вами.

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