Jorge Y. C. Rodriguez
Jorge Y. C. Rodriguez

Reputation: 3449

Laravel casting JSON to array?

I'm trying to convert the a JSON field to array. For example the model is like this:

protected $casts = [
    'content' => 'array'
]; 

While in insert the content inside, I do it like this:

'content'=> json_encode([
                'description' => $faker->paragraph(3),
                'about' => $faker->paragraph(2),
                'info' => $faker->paragraph(2),
                'updated' => $faker->dateTimeBetween('-1 years', 'now')
]),

But while getting the data it prints a string, nothing else.

The migration in this part looks like this:

$campaign->json('content');

Sample of the output:

"content": "{\"description\":\"Ut quas quo odio illo. Voluptates quia fuga itaque sint. Velit sapiente fugit ea ut ducimus sint tempora eligendi. Ea et molestiae consequuntur quibusdam soluta voluptatem.\",\"about\":\"Aut voluptates et iste ut perspiciatis. Esse sunt ullam inventore sit doloremque et quisquam.\",\"info\":\"Corrupti et facere exercitationem consequatur aspernatur quo saepe. Omnis et tempore enim ut. Quia magnam quia enim et eos enim.\",\"updated\":{\"date\":\"2015-11-22 08:25:13.000000\",\"timezone_type\":3,\"timezone\":\"UTC\"}}",

Any ideas why?

Upvotes: 20

Views: 54754

Answers (3)

Marcin Nabiałek
Marcin Nabiałek

Reputation: 111829

When you define a cast to type array you don't need to do any json_encode or json_decode.

When you want to insert, all you need to do:

'content'=> [
    'description' => $faker->paragraph(3),
    'about' => $faker->paragraph(2),
    'info' => $faker->paragraph(2),
    'updated' => $faker->dateTimeBetween('-1 years', 'now')
],

Laravel will do the rest

And when you want to get content field data, you simple need to use:

$campaign->content;

and you will have here array, so if you want to display description, you simple need to do:

echo $campaign->content['description'];

Upvotes: 21

mangonights
mangonights

Reputation: 979

If you want your mind blown...

// automatically handles json_encode, json_decode to php object
protected $casts = [
    'db_json_column' => 'object'
];

$model->db_json_column = $array; // persisted as json
$object = $model->db_json_column; // retrieved as object

or,

// automatically handles json_encode, json_decode to php array
protected $casts = [
    'db_json_column' => 'array'
];

$model->db_json_column = $array; // persisted as json
$array = $model->db_json_column; // retrieved as array

Upvotes: 19

zt1983811
zt1983811

Reputation: 1017

Just use json_decode with option array true

json_decode($casts['content'], true));

Upvotes: 2

Related Questions