使用Laravel 5.3,我有一个具有以下功能的模型
public function myData() {
return $this->hasMany(MyData::class);
}
在我的收藏中我有以下
$my_data = MyModel->myData()->get();
到目前为止一切顺利。如果我return $my_data
我得到了一个有三个项目的雄辩集合。
我现在需要的是创建该集合的副本,但只包含三个字段。
我尝试了几种不同的东西,每种都会返回错误。以下是我得到的最接近的,但这会返回一个空数组 - 我假设因为这些字段位于比集合对象更深的一层。
$new_collection = $my_data->only(['field_1', 'field_2', 'field_3']);
创建包含所有三个项目的新集合的正确方法是什么,每个项目只包含三个选定的字段?
感谢您的帮助
答案 0 :(得分:5)
您可以使用map:
$slimmed_down = $collection->map(function ($item, $key) {
return [
'field_1' => $item->field_1,
'field_2' => $item->field_2,
'field_3' => $item->field_3
];
});
这将返回一个只有您想要的值的新Collection
。据我所知,没有任何其他方法可以满足您的需求,因此迭代每个项目并以这种方式选择字段是少数解决方案之一。
使用map
代替标准foreach
循环的好处是,当您使用map
时,它会返回Collection
的新实例。
修改强>
在对此进行一些思考和研究之后,您已经创建的问题是Collection
中的所有值都不再是任何事物的实例。如果你不介意这种效果,那么这样做会更漂亮,更快捷:
$slimmed_down = $collection->toArray()->only(['field_1', 'field_2', 'field_3']);
这基本上有相同的结果。