如何KeyBy多个项目具有相同的密钥

时间:2015-10-28 16:35:51

标签: php laravel laravel-5.1

我正在使用Laravel Collections方法,并尝试通过id键入我的查询结果(这是一个集合)。问题是我有多个具有相同ID的条目,但指向不同的国家/地区,我希望拥有所有值,而不仅仅是最后一个。

这是我目前使用的代码:

   $allCountries = new Collection($allCountries);

   $offerCountries = $allCountries->keyBy('id');

    dd($offerCountries);

    foreach ($offer as $o) {

       $o->countries = $allCountries->get($o->id);

    }

为了解释,我的查询将结果放在$ allCountries中,其中包含ID和国家/地区,这些结果看起来像这样

id=>225, country=>US
id=>225, country=>IT
id=>3304, country=>NZ

只是为了给你一个快速的想法。我想通过导致$ offerCountries的id来键入这个。然后我循环通过之前的Collection,其中包含具有与id的国家/地区结果相关的特定ID的商品。因此,对于报价225,它包含的国家是美国和IT。我遍历每个商品,并将countries对象设置为等于所有$ allCountries id。我在这里遇到的问题是keyBy覆盖了值,只占用了最后一个。我希望得到这样的结果:

 [
   225 => countries: {'id' => 225, 'country' => 'US'}, {'id' =>           
   '225', 'country' => 'IT'}
    3304 => ['id' => 3304, 'country' => 'NZ'],
]

是否有laravel方法来执行此操作,或者我是否需要编写自己的keyBy以便它不会覆盖。如果是这样,我该如何开始编写这个方法?

由于

2 个答案:

答案 0 :(得分:9)

没有keyBy但是groupBy

$countriesById = collect($allCountries)->groupBy('id');

答案 1 :(得分:0)

您可以使用过滤器并创建自定义过滤器

$filtered = $allCountries->filter(function ($item) use ($id) {
    return $item->id == $id;
});

$filtered->all();