Search code examples
laraveleloquentcastingquery-buildereloquent-relationship

Is there any way to cast a relationship table attribute in laravel?


I have a users model with a carts function that returns all carts detail after joining three tables. I would like to convert an attribute to an array which is a JSON type.

Example: I have four table users, carts, item_detail_informations, and item_details tables where item_details table picture column is a JSON type. I want to convert picture JSON data to an array. enter image description here

My carts function is like this.

public function carts()
{
    return $this->hasMany('App\Models\Cart')
    ->join('item_detail_informations', 'carts.item_detail_information_id','=','item_detail_informations.id')
    ->join('item_details', 'item_detail_informations.item_detail_id','=','item_details.id')
    ->join('items', 'item_details.item_id','=','items.id')
    ->select('carts.user_id','carts.item_detail_information_id','item_detail_informations.size','item_detail_informations.price','item_detail_informations.item_detail_id', 'item_details.picture','item_details.item_id')
    ;
}

I am trying to cast picture attribute like this.

protected $casts = [
    'item_details.picture' => 'array',
];

But it's not working. Is there any way to convert the picture attribute to JSON?


Solution

  • Remove all joins in carts method(instead use eager loading via with). And cast attribute in the ItemDetail model. it will automatically picked up when you call carst method. Hope it will help you