Php 按关系id采集并获取计数

Php 按关系id采集并获取计数,php,laravel,eloquent,laravel-collection,Php,Laravel,Eloquent,Laravel Collection,我有项目和国家模型。这是一种多对多的关系。我得到了一些国家的项目。结果如下 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" =

我有项目和国家模型。这是一种多对多的关系。我得到了一些国家的项目。结果如下

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()
问题。我可以使用Pulk和嵌套关系列,并有更多简短而好的解决方案吗??比如像这样

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

或者反过来

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

从“国家/地区”表获取数据后,您将获得唯一的国家/地区,反之亦然

Country::whereHas('projects', function ($query) {
    // $query->where(); if you want to limit the projects
})->count();
从countries(国家/地区)表获取数据后,您将获得唯一的国家/地区。您可以使用以下选项:

$projects->pluck('countries.*.id')->flatten()->unique()->count()
您不能使用:

$projects->pluck('countries.id')...
因为国家是一个数组。 但是您可以在这些情况下使用
'countries.*.id'

您可以使用:

$projects->pluck('countries.*.id')->flatten()->unique()->count()
您不能使用:

$projects->pluck('countries.id')...
因为国家是一个数组。 但是您可以在这些情况下使用
'countries.*.id'

我找到了这个解决方案

$projects->groupBy('countries.*.id')->count();
我找到了这个解决办法

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

嵌套的Pull不可能,因为它返回数组。我认为您自己的解决方案很好。@MisaGH我得到了这个解决方案
$projects->pull('countries.*.id')->collapse()->unique()->count()
但我认为还有更好的解决方案嵌套的Pull是不可能的,因为它返回数组。我认为您自己的解决方案是好的。@MisaGH我得到了这个解决方案
$projects->Pull('countries.*.id')->collapse()->unique()->count()
但我认为有更多更好的解决方案您的解决方案是好的。但我使用更复杂的查询来获取这些数据。我得到它帐户->项目->国家嵌套查询。我不能更改初始查询,也不使用第二个queryOki,这不适用于这个问题,但我认为
whereHas
接受多个嵌套级别的点表示法,如
Account::whereHas('projects.countries',…
您的解决方案很好。但是我使用更复杂的查询来获取数据。我得到的是account->projects->countries嵌套查询。我不能更改初始查询,我也不使用第二个queryOki,不适用于这个问题,但我认为
whereHas
接受多个嵌套级别的点表示法,如
账户::whereHas('projects.countries'),…