Cómo recuperar un conjunto de resultados de una consulta raw como una matriz en lugar de un objeto en Laravel 3


De forma predeterminada, los métodos de consulta raw de Laravel devuelven los resultados como matrices de objetos stdClass:

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
        )
)

La pregunta es cómo hacer que Laravel devuelva una matriz de matrices en su lugar:

   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
            )
    )
Author: JamesG, 2012-12-06

3 answers

Respuesta original para Laravel 3

Eloquent tiene un método to_array()

De los documentos:

El método to_array tomará automáticamente todos los atributos en su modelo, así como cualquier relación cargada.

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

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

O

return Response::eloquent($user);

Si está utilizando fluent, puede hacer lo que Sinan sugirió y cambiar la configuración global para devolver una matriz asociativa en lugar de objetos.

Alternativamente, puede convertir un objeto a y desde JSON a convertirlo en una matriz, aunque la opción global sería preferible en la mayoría de los casos. Puede usar lo siguiente en proyectos donde prefiere objetos normalmente, pero en ciertos casos de bordes necesita una matriz. Este método no jugará bien con Eloquent, use los métodos anteriores en ese caso.

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

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

Otra opción sería cambiar temporalmente la configuración del tiempo de ejecución

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

Para Laravel ~4

A partir de Laravel 4, todos los nombres de métodos se ajustan a los estándares PSR-2.

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

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

// In Laravel 5 onward the functions are preferred to facades.
return response()->json($user->toArray());
 19
Author: David Barker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-16 09:50:58

También puede obtener todo el resultado siempre como matriz cambiando

Application/config/database.php

'fetch' => PDO::FETCH_CLASS,

En la línea 31 a

'fetch' => PDO::FETCH_ASSOC,
 35
Author: Sinan Eldem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-06 16:01:32

No se si laravel tiene en función built para devolver resultados como array pero si no puedes usar este fragmento:

Donde $data es su matriz devuelta de objetos

$data = json_decode(json_encode((array) $data), true);
 11
Author: Dale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-06 15:01:40