Коллекция извлекается по идентификатору отношения и получает счет

У меня есть проект и модель страны. Есть отношения "многие ко многим". Я получаю проекты со странами. Результат ниже

array:5 [▼
  0 => array:5 [▼
    "id" => 2
    "account_id" => 1
    "start_date" => "Jul 2012"
    "end_date" => "Aug 2013"
    "countries" => array:1 [▼
      0 => array:2 [▼
        "id" => 148
        "pivot" => array:2 [▶]
      ]
    ]
  ]
  1 => array:5 [▶]
  2 => array:5 [▶]
  3 => array:5 [▶]
  4 => array:5 [▶]
]

Я не буду считать все уникальные страны. Сейчас я делаю это так

$projects->pluck('countries')->collapse()->pluck('id')->unique()->count()

Вопрос. Могу ли я использовать pluck с вложенным столбцом отношений и получить более короткое и хорошее решение? например вот так

$projects->pluck('countries.id')->count();

person Davit    schedule 12.12.2018    source источник
comment
вложенный сбор невозможен, так как он возвращает массив.   -  person Sagar Gautam    schedule 12.12.2018
comment
Думаю, твое собственное решение - это хорошо.   -  person Misagh Laghaei    schedule 12.12.2018
comment
@MisaGH Я получил это решение $projects->pluck('countries.*.id')->collapse()->unique()->count(), но я думаю, что есть более хорошее решение   -  person Davit    schedule 12.12.2018


Ответы (3)


Вы можете использовать это:

$projects->pluck('countries.*.id')->flatten()->unique()->count()

Вы не можете использовать:

$projects->pluck('countries.id')...

Потому что страны - это массив массивов. Но вы можете использовать 'countries.*.id' в этих случаях

person Diogo Gomes    schedule 12.12.2018

Или наоборот ...

Country::whereHas('projects', function ($query) {
    // $query->where(); if you want to limit the projects
})->count();

Вы получаете уникальные страны с момента получения из таблицы стран

person Jane    schedule 12.12.2018
comment
ваше решение хорошее. но я получаю эти данные с помощью более сложного запроса. Я получаю account- ›проекты-› вложенный запрос стран. Я не могу изменить исходный запрос и не использую второй запрос - person Davit; 12.12.2018
comment
Оки, не применимо к этому вопросу, но я думаю, что whereHas принимает точечную нотацию для нескольких уровней вложенности, например Account::whereHas('projects.countries', ... - person Jane; 12.12.2018

Я нахожу это решение

$projects->groupBy('countries.*.id')->count();
person Davit    schedule 13.12.2018