0

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);
}
Reem Aziz
  • 1,425
  • 2
  • 17
  • 22
  • I might be wrong, but as far as I know, there is a default cast on the `id` column to `int`/`numeric`, which will simply reset your `str_pad` changes when you serialize the object to json. – Namoshek Apr 14 '18 at 12:35

2 Answers2

1

When you retrieves the data it has already ignored the zeros. I think you need an accessor for it:

function getIdAttribute($value) {
    return str_pad($value, 10, '0', STR_PAD_LEFT);
}

Hope this helps.

Muhammad Nauman
  • 1,249
  • 8
  • 10
1

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);
}
Namoshek
  • 6,394
  • 2
  • 19
  • 31
  • thank you it worked but not the code you put the link you attach , means I added the keyType in model not controller – Reem Aziz Apr 14 '18 at 16:05
  • Sorry, I might have made a mistake in my answer. The `$keyType` property is `protected` and requires to be set via the setter `$model->setKeyType('string')`. I fixed it in my answer above. -- I would advice you to adjust your code accordingly, as changing the type of the primary key may cause issues in other parts of your application. – Namoshek Apr 14 '18 at 16:45