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

时间:2017-06-26 12:16:53

标签: laravel collections

使用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']);

创建包含所有三个项目的新集合的正确方法是什么,每个项目只包含三个选定的字段?

感谢您的帮助

1 个答案:

答案 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']);

这基本上有相同的结果。