Home > Software design >  Laravel how to modify the returned result from eloquent to convert json string to json object
Laravel how to modify the returned result from eloquent to convert json string to json object

Time:01-26

Description and welcomeEmailContents are type text in db ,and both store same type data . Description return json obj while issue is welcomeEmailContents return string.

$course_desc_blocks = ($courseData['description'] != null) ? json_encode($courseData['description']) : null;
$course_welcome_blocks = ($courseData['welcomeEmailContents'] != null) ? json_encode($courseData['welcomeEmailContents']) : null;
    
//Laravel Query:-
 $courseData = Course::select('id', 'title', 'description','welcomeEmailContents', 'price', 'site_id', 'status', 'expiry_days')->orderBy('id', 'asc'));
return response()->json( $courseData );
//===================================== 
//output
{
  "data": {
    "id": 100,
    "title": "Python",
    "description": [
      {
        "type": "paragraph",
        "data": {
          "text": "jsonTesting"
        }
      }
    ],
    "welcomeEmailContents": "[{\"type\":\"paragraph\",\"data\":{\"text\":\"Testingjson\"}}]",
    "price": 0
  }
  
}

CodePudding user response:

The easiest way to accomplish this would be to add a json cast to the welcomeEmailContents field.

class Course extends Model
{
    protected $casts = [
        'welcomeEmailContents' => 'json',
    ];
}

Please note that with the snippet above you no longer have to manually encode the json when setting the field but instead just set it as an array.

Course::create([
    // Some more fields...
    'welcomeEmailContents' => [
        [
            'type' => 'paragraph',
            'data' => [
                'text' => 'testingjson',
            ],
        ],
    ],
]);

There are multiple ways to accomplish the above. You can find more info on this in the documentation: https://laravel.com/docs/8.x/eloquent-mutators

  •  Tags:  
  • Related