【问题标题】:Collection pluck by relation id and get count按关系 id 收集并获取计数
【发布时间】:2019-05-13 19:50:15
【问题描述】:

我有项目和国家模型。存在多对多关系。我得到国家的项目。结果如下

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();

【问题讨论】:

  • 嵌套 pluck 是不可能的,因为它返回数组。
  • 我觉得你自己的解决方案不错。
  • @MisaGH 我得到了这个解决方案$projects->pluck('countries.*.id')->collapse()->unique()->count() 但我认为还有更好的解决方案

标签: php laravel eloquent laravel-collection


【解决方案1】:

或者反过来……

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

自从您从国家/地区表中获取后,您获得了独特的国家/地区

【讨论】:

  • 你的解决方案很好。但我使用更复杂的查询获取这些数据。我得到它 account->projects->countries 嵌套查询。我无法更改初始查询,也不使用第二个查询
  • Oki,不适用于这个问题,但我认为 whereHas 接受多个嵌套级别的点表示法,例如 Account::whereHas('projects.countries', ...
【解决方案2】:

你可以用这个:

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

你不能使用:

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

因为国家是一个数组数组。 但是你可以在这些情况下使用'countries.*.id'

【讨论】:

    【解决方案3】:

    我找到了这个解决方案

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

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2016-03-09
      • 2017-05-01
      相关资源
      最近更新 更多