Search code examples
laravelcollections

select certain columns from eloquent collection after the query has executed


Using Laravel 5.3, I have a model with the following function

public function myData() {
    return $this->hasMany(MyData::class);
}

and in my collection I have the following

$my_data = MyModel->myData()->get(); 

All good so far. If I return $my_data I get an eloquent collection with three items.

What I need now though is to create a duplicate of that collection but containing only three of the fields.

I have tried several different things, each of which return an error. The following is the closest I have got, but this returns an empty array - I assume because the fields are located one level deeper than the collection object.

$new_collection = $my_data->only(['field_1', 'field_2', 'field_3']);

What would be the correct way to create a new collection containing all three items, each with only the three selected fields?

Thanks for your help


Solution

  • You could use map:

    $slimmed_down = $collection->map(function ($item, $key) {
        return [
            'field_1' => $item->field_1,
            'field_2' => $item->field_2,
            'field_3' => $item->field_3
        ];
    });
    

    This will return a new Collection with just the values you want. As far as I know there isn't any other method that does what you want, so iterating over every item and selecting the fields this way is one of the few solutions.

    The advantage of using map instead of a standard foreach loop is that when you use map it returns a new instance of Collection.

    Edit:

    After some thoughts and research about this, the problem you'll have created is that the all the values in the Collection aren't instances of anything anymore. If you don't mind this effect, an even prettier and faster way would be to do this:

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

    This basically has the same result.