从Laravel集合中提取字段子集



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

$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方法的实现。作者添加了这个方法,现在可以正常工作了。

你很接近,但你不链maponly,only似乎不能在嵌套的arrays/objects的集合上工作。

因此,对于您的情况,使用map()与Callback:

$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"
]
]

注意:如果这些是arrays而不是objects,那么你应该做$row['age']$row['name']而不是$row->age$row->name。在Laravel中,模型都是,并且允许任意一种语法。

引用:

https://laravel.com/docs/9.x/collections method-map

https://laravel.com/docs/9.x/collections方法只编辑:

一些替代品。如果您有CollectionModels,那么您可以本地执行:

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

如果你有一个CollectionCollections,那么你可以这样做:

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

最后,如果您arrays或objects,您可以collect()并调用->only():

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

最新更新