Search code examples
phpmysqljsonlaravelzerofill

how to represent MySql zerofill in JSON response


Hello everyone I am tring to retrive my Column That have a zerofill specifications with json response but it seems to be that php ignore the zeros in there , so i tried to use str_pad to do the same work as the zerofill but it's ignore it too !!! so how can i fix that issue ? here is my code

public function getGeneralPost(){
    $post =Post::inRandomOrder()->orderBy('created_at', 'DESC')->get();
    foreach ($post as $item){
        $categories = Category::where('id' , $item->post_subtype)->select('category_title')->first();
        $categories_type = Category::where('id' , $item->post_type)->select('category_title')->first();
        $item->post_subtype = $categories->category_title;
        $item->post_type = $categories_type->category_title;
        $item->id = str_pad($item->id ,10,'0',STR_PAD_LEFT);// here I am usting str_pad     
    }
    $success['posts'] =$post;
    return response()->json(['code'=>'success','success' => $success], $this->successStatus);
}

Solution

  • As already noted in the comments, there seems to be a default cast for the id column to int, which will revert your changes done through str_pad().

    To circumvent the issue, you could either store the padded id in a separate field which has no cast in place or, instead of altering the object, you could get the attributes of the object, alter them and use them to return your result.

    Just from the framework code itself, it might also be possible to override the $keyType property of your objects before returning them:

    public function getGeneralPost() {
        $post = Post::inRandomOrder()->orderBy('created_at', 'DESC')->get();
        foreach ($post as $item) {
            $categories = Category::where('id' , $item->post_subtype)->select('category_title')->first();
            $categories_type = Category::where('id' , $item->post_type)->select('category_title')->first();
            $item->post_subtype = $categories->category_title;
            $item->post_type = $categories_type->category_title;
    
            $item->setKeyType('string');
            $item->id = str_pad($item->id ,10,'0',STR_PAD_LEFT);
        }
        $success['posts'] = $post;
        return response()->json(['code'=>'success','success' => $success], $this->successStatus);
    }