Home » Php » php – RESTful API – Array to Collection Laravel 5

php – RESTful API – Array to Collection Laravel 5

Posted by: admin July 12, 2020 Leave a comment


I’m having issues with an array returned from DB::select(). I’m heavily using skip and take on Collections of eloquent models in my API. Unfortunately, DB::select returns an array, which obviously doesn’t work with skip and take’s. How would one convert arrays to a collection that can utilise these methods?

I’ve tried


Which doesn’t quite work as I expected, as it wraps the entire array in a Collection, not the individual results.

Is it possible to convert the return from a DB::select to a ‘proper’ Collection that can use skip and take methods?


I’ve also tried:

$query = \Illuminate\Support\Collection::make(DB::table('survey_responses')->join('people', 'people.id',
        '=', 'survey_responses.recipient_id')->select('survey_responses.id', 'survey_responses.response',
        'survey_responses.score', 'people.name', 'people.email')->get());

Which still tells me:

FatalErrorException in QueryHelper.php line 36:
Call to a member function skip() on array


How to&Answers:

I would try:

$queryResult = DB::table('...')->get();

$collection = collect($queryResult);

If the query result is an array, the collection is filled up with your results. See the official documentation for the collection. Laravel5 Collections


For anyone else that’s having this sort of problem in Laravel, I figured out a work around with the following solution:

        $query = DB::table('survey_responses')->join('people', 'people.id', '=', 'survey_responses.recipient_id')
            ->select('survey_responses.id', 'survey_responses.response', 'survey_responses.score', 'people.name', 'people.email');
                foreach($tags as $tag){
                    $query->orWhere('survey_responses.response', 'like', '%'.$tag.'%');

        // We apply the pagination headers on the complete result set - before any limiting
        $headers = \HeaderHelper::generatePaginationHeader($page, $query, 'response', $limit, $tags);
        // Now limit and create 'pages' based on passed params
            (isset($page) ? $page - 1 * (isset($limit) ? $limit : env('RESULTS_PER_PAGE', 30)) : 1)
            (isset($limit) ? $limit : env('RESULTS_PER_PAGE', 30))

Basically, I wasn’t aware that you could run the queries almost incrementally, which enabled me to generate pagination chunks before limiting the data returned.