从Laravel集合中提取字段子集

f45qwnt8  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一个这样的Laravel集合(近似使用数组语法;实际数据是从API响应而不是本地DB获得的objectCollection):

$rows = [
  [
    'id': 1,
    'name': 'Sue',
    'age': 23,
  ],
  [
    'id': 2,
    'name': 'Joe',
    'age': 25,
  ],
]

我想提取字段的子集:

$subset = [];
foreach ($rows as $row) {
  $subset[] = ['name' => $row['name'], 'age' => $row['age']];
}

这样我最终得到:

$subset = [
  [
    'name': 'Sue',
    'age': 23,
  ],
  [
    'name': 'Joe',
    'age': 25,
  ],
]

我应该使用什么Collection方法来代替for循环来实现这一点?
我发现了这个建议,使用了一个更高阶的信息,它有一定的意义:

$subset = $rows->map->only(['name', 'age']);

但这只是得到了一个null值的Collection。将它扩展为一个常规的map调用产生了相同的效果。我感觉我需要某种multipluck,但我不确定它对应于什么!

更新

事实证明,我用高阶map->only方法做的是正确的。然而,虽然我的集合中的项是Model的一种,但它们不是 LaravelModel类的子类或兼容实现,并且缺少only方法的实现。作者添加了该方法,现在它按预期工作了。

idfiyjo8

idfiyjo81#

你很接近,但是你没有把maponly链接起来,而且only似乎不能在嵌套的array s/object s的集合上工作。
因此,对于您的情况,请使用带有回调的map()

$rows = collect([
  (object)[
    'id' => 1,
    'name' => 'Sue',
    'age' => 23,
  ],
  (object)[
    'id' => 2,
    'name' => 'Joe',
    'age' => 25,
  ]
]);

$mapped = $rows->map(function ($row) {
  return ['age' => $row->age, 'name' => $row->name];
});

dd($mapped->toArray());

其输出将为:

array:2 [▼
  0 => array:2 [▼
    "age" => 23
    "name" => "Sue"
  ]
  1 => array:2 [▼
    "age" => 25
    "name" => "Joe"
  ]
]

注意:如果它们是array s而不是object s,那么你应该使用$row['age']$row['name'],而不是$row->age$row->name。在Laravel中,Model是两者,并且允许任何一种语法。
参考文献:
https://laravel.com/docs/9.x/collections#method-map
https://laravel.com/docs/9.x/collections#method-only
编辑:
如果你有一个Model s的Collection,那么你可以在本地做:

$mapped = $rows->map(function ($model) {
  return $model->only(['age', 'name']);
});

如果你有一个CollectionCollection的s,那么你可以做:

$mapped = $rows->map(function ($collection) {
  return $collection->only(['age', 'name']);
});

最后,如果您使用arrayobject,您可以使用collect()并调用->only()

$mapped = $rows->map(function ($row) {
  return collect($row)->only(['age', 'name']);
});

相关问题