Уровень 6. ActiveCount дочерних отношений дочерних отношений - PullRequest
0 голосов
/ 24 октября 2019

Я строю систему с 3-мя моделями (Нация, министр, офицер).

  1. В стране много министров;
  2. У каждого министра много офицеров

Модель: Нация

function ministers(){
    return $this->hasMany( Minister::class );
}

Модель: министр

function officers(){
    return $this->hasMany( Officer::class );
}


function officersActiveCount(){
    return $this->hasMany( Officer::class)->where('state', 'active' )->count();
}

Следующее работает нормально. Он получает всех офицеров с соответствующими министрами.

$nation = Nation::where('id', $nation_id)->with('ministers.officers')->get();

Но я хочу, чтобы «министры» и «фицерыАктивКонт »НЕ« офицеры »

Как мне получить офицерыАктивный счет с каждой нацией?

...

1 Ответ

0 голосов
/ 24 октября 2019

Измените отношение на модели Министр и снимите счет. Это количество в отношениях испортит нетерпеливую загрузку. Итак:

function active(){
   return $this->hasMany( Officer::class)->where('state', 'active' );
}

Теперь вы можете использовать замыкание в методе with(), извлечь это вторичное отношение и получить счет, используя метод Larvel withCount().

Примерно так:

 $nation = Nation::where('id', $nation_id)->with(['ministers' => function($query){
        $query->withCount('active');
    }])->get();

Он должен быть загружен с нетерпением, и вы можете получить доступ к активному счету через объект $nation и его отношение, ministers:

 $activeOfficers = $nation->ministers->first()->active_count;

Это даст вам активных офицеров для первого министра этой нации. Если вы хотите сложить все из них, просто зациклите:

$totalActiveOfficersForNation = 0;
foreach($nation->ministers as $minister){
    $totalActiveOfficersForNation += $minister->active_count;
}

Есть и другие способы подсчета столбцов, но это довольно просто.

Надеюсь, это поможет.

...