How to retrieve a result set from a raw query as an array instead of an object in Laravel 3
Asked Answered
H

3

34

By default, Laravel's raw query methods return results as arrays of stdClass objects:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [username] => admin
            [password] => admin123
            [email] => [email protected]
            [created_at] => 2012-12-06 18:57:19
            [updated_at] => 2012-12-06 00:00:00
        )

    [1] => stdClass Object
        (
            [id] => 2
            [username] => userna
            [password] => user
            [email] => [email protected]
            [created_at] => 2012-12-06 00:00:00
            [updated_at] => 2012-12-05 00:00:00
        )
)

The question is how to have Laravel return an array of Arrays instead:

   Array
    (
        [0] => Array
            (
                [id] => 1
                [username] => admin
                [password] => admin123
                [email] => [email protected]
                [created_at] => 2012-12-06 18:57:19
                [updated_at] => 2012-12-06 00:00:00
            )

        [1] => Array
            (
                [id] => 2
                [username] => userna
                [password] => user
                [email] => [email protected]
                [created_at] => 2012-12-06 00:00:00
                [updated_at] => 2012-12-05 00:00:00
            )
    )
Hydrastis answered 6/12, 2012 at 14:53 Comment(4)
Please provide your code that result in thisFu
This made perfect sense to me, I'm trying to learn Laravel and ran into this roadblock. It's a real and valid question - wondering if the people that say it isn't have any experience with this framework?Desecrate
Why the hell was this closed? People need to get over themselves.Sudanic
Have a better answer to add, please reopenModify
B
22

Original answer for Laravel 3

Eloquent has a method to_array()

From docs:

The to_array method will automatically grab all of the attributes on your model, as well as any loaded relationships.

$user = User::find($id);

return Response::json($user->to_array());

or

return Response::eloquent($user);

If you are using fluent, you can do as Sinan suggested and change the global configuration to return an associative array rather than objects.

Alternatively, you can convert an object to and from JSON to convert it to an array although the global option would be preferable in most cases. You can use the following in projects where you prefer objects normally but in certain edge cases need an array. This method will not play well with Eloquent, use the methods above in that case.

$users = DB::table('users')->where('name', '=', 'david')->get();

return array_map(function($val)
{
    return json_decode(json_encode($val), true)
}, $users);

Another option would be to temporarily change the runtime configuration

Config::set('database.fetch', PDO::FETCH_ASSOC);

For Laravel ~4

In Laravel 4 onwards, all method names conform to PSR-2 standards.

$user = User::findOrFail($id);

return Response::json($user->toArray());

// In Laravel 5 onward the functions are preferred to facades.
return response()->json($user->toArray());
Begot answered 6/12, 2012 at 15:10 Comment(7)
Unhandled Exception Message: Call to undefined method stdClass::to_array()Hydrastis
This is for Laravel 3.x, to_array() is a method of Eloquent. Also in the docs laravel.com/docs/database/eloquent. Could you share some of your code for us to see where the problem lies?Begot
Does Fluent have an equivalent of to_array()?Danutadanya
His problem is: $arrOfObjects = DB::connection()->query('SELECT * from `table` LIMIT 0, 3'); Which does return an array of objects. Sinan answered it. The stdClass is determined in the laravel/database/connection.php file based on the config.Jut
@Sinan is correct. Simply modify the config file and move on with your project. Be careful though if your app is a workflow since not all users will have this setting. If it's just for you then this works fine.Ragan
in laravel 4, this function not foundZurn
That's beause this answer is for laravel 3. Laravel 4 is toArray()Begot
T
36

You may also get all the result always as array by changing

application/config/database.php

'fetch' => PDO::FETCH_CLASS,

on line 31 to

'fetch' => PDO::FETCH_ASSOC,
Trapes answered 6/12, 2012 at 16:1 Comment(5)
but how to do it dynamically in the code? I only want to fetch as Array for one DB connection. I have this connection $sqlserv_connection = DB::connection($this->getSqlServerConnectionName()); I want something like $sqlserv_connection->fetch(PDO::FETCH_ASSOC) I know this doesn't exist but how can I achieve this?Amye
Just want to point out the 'fetch' setting is not connection specific and is at the top of database.php. Somehow I inferred it was connection specific and added it to each connection, which has no effect. Hopefully that helps some other misguided soul.Cressler
Not sure about 4 or 3, but in Laravel 5, you can make a query: $query = DB::table('companies')->where('status', 'active'); then set this before you run it DB::connection()->setFetchMode(\PDO::FETCH_ASSOC); then get the result $result = $query->get()->toArray(); and $result will be an array of arraysVentral
@PhillipHarrington this seems to have been removed :( Error: Call to undefined method Illuminate\Database\MySqlConnection::setFetchMode()Grotius
@JeffPuckett Looks like it was dropped in 5.4 per this issue: github.com/laravel/framework/issues/17728Ventral
B
22

Original answer for Laravel 3

Eloquent has a method to_array()

From docs:

The to_array method will automatically grab all of the attributes on your model, as well as any loaded relationships.

$user = User::find($id);

return Response::json($user->to_array());

or

return Response::eloquent($user);

If you are using fluent, you can do as Sinan suggested and change the global configuration to return an associative array rather than objects.

Alternatively, you can convert an object to and from JSON to convert it to an array although the global option would be preferable in most cases. You can use the following in projects where you prefer objects normally but in certain edge cases need an array. This method will not play well with Eloquent, use the methods above in that case.

$users = DB::table('users')->where('name', '=', 'david')->get();

return array_map(function($val)
{
    return json_decode(json_encode($val), true)
}, $users);

Another option would be to temporarily change the runtime configuration

Config::set('database.fetch', PDO::FETCH_ASSOC);

For Laravel ~4

In Laravel 4 onwards, all method names conform to PSR-2 standards.

$user = User::findOrFail($id);

return Response::json($user->toArray());

// In Laravel 5 onward the functions are preferred to facades.
return response()->json($user->toArray());
Begot answered 6/12, 2012 at 15:10 Comment(7)
Unhandled Exception Message: Call to undefined method stdClass::to_array()Hydrastis
This is for Laravel 3.x, to_array() is a method of Eloquent. Also in the docs laravel.com/docs/database/eloquent. Could you share some of your code for us to see where the problem lies?Begot
Does Fluent have an equivalent of to_array()?Danutadanya
His problem is: $arrOfObjects = DB::connection()->query('SELECT * from `table` LIMIT 0, 3'); Which does return an array of objects. Sinan answered it. The stdClass is determined in the laravel/database/connection.php file based on the config.Jut
@Sinan is correct. Simply modify the config file and move on with your project. Be careful though if your app is a workflow since not all users will have this setting. If it's just for you then this works fine.Ragan
in laravel 4, this function not foundZurn
That's beause this answer is for laravel 3. Laravel 4 is toArray()Begot
C
10

I don't know if laravel has in built function for returning results as array but if not you can use this snippet:

Where $data is your returned array of objects

$data = json_decode(json_encode((array) $data), true);
Conversant answered 6/12, 2012 at 15:1 Comment(3)
@ramesh No problem, there is another answer here that may be of more use as it is using laravel methods see DavidBarker answerConversant
This is a very bad practice, since you're both encoding it and then decoding it. This will result in the exact same outcome: $data = (array) $data;Fu
@nerdklers It wont because $data is already an array it won't change the inner objects to an array, I did try that method myself before posting this unruly workaround :)Conversant

© 2022 - 2024 — McMap. All rights reserved.