Laravel 执行查询后,从eloquent集合中选择某些列

Laravel 执行查询后,从eloquent集合中选择某些列,laravel,collections,Laravel,Collections,使用Laravel5.3,我有一个具有以下功能的模型 public function myData() { return $this->hasMany(MyData::class); } 在我的收藏中,我有以下几点 $my_data = MyModel->myData()->get(); 到目前为止一切都很好。如果我返回$my_data我会得到一个包含三个项目的有说服力的集合 不过,我现在需要的是创建该集合的副本,但只包含三个字段 我尝试了几种不同的方法,每种方法

使用Laravel5.3,我有一个具有以下功能的模型

public function myData() {
    return $this->hasMany(MyData::class);
}
在我的收藏中,我有以下几点

$my_data = MyModel->myData()->get(); 
到目前为止一切都很好。如果我
返回$my_data
我会得到一个包含三个项目的有说服力的集合

不过,我现在需要的是创建该集合的副本,但只包含三个字段

我尝试了几种不同的方法,每种方法都会返回一个错误。下面是我得到的最接近的一个数组,但它返回一个空数组——我假设是因为字段位于集合对象的一个层次之上

$new_collection = $my_data->only(['field_1', 'field_2', 'field_3']);
创建包含所有三个项的新集合的正确方法是什么,每个项仅包含三个选定字段

感谢您的帮助

您可以使用:

这将返回一个新的
集合
,其中包含您想要的值。据我所知,没有任何其他方法可以满足您的需要,因此以这种方式迭代每个项并选择字段是为数不多的解决方案之一

使用
map
而不是标准的
foreach
循环的优点是,当使用
map
时,它会返回
集合的新实例

编辑:

在对此进行一些思考和研究之后,您将遇到的问题是
集合中的所有值都不再是任何内容的实例。如果您不介意这种效果,一种更漂亮、更快的方法是:

$slimmed_down = $collection->toArray()->only(['field_1', 'field_2', 'field_3']);

这基本上具有相同的结果。

您不能仅对
toArray()的结果调用
。因为它是一个数组,而不是集合。
$slimmed_down = $collection->toArray()->only(['field_1', 'field_2', 'field_3']);