Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Eloquent Attribute Casting not work

I have a Laravel Models that return string value instead of integer in my staging server. I decided to cast attribute's values to get always the integer value.

I report my Model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class PressReviewPreset extends Model
{
    /**
     *  Use soft delete
     */
    use SoftDeletes;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'pr_preset';

    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
    */
    protected $dates = ['deleted_at'];

    /**
     * The attributes that should be casted to native types.
     *
     * @var array
    */
    protected $casts = [
        'id' => 'integer',
        'user_id' => 'integer',
        'is_default' => 'integer',
    ];

    /**
     * The database field "updated_at" of table with a custom name
     * @var string
     */
    const UPDATED_AT = 'last_update';

    /*
    |---------------------------|
    |   Aliases for attribute   |
    |---------------------------|
    */

    // Id
    public function getIdAttribute()
    {
        return $this->attributes['id'];
    }
    public function setIdAttribute($id)
    {
        $this->attributes['id'] = $id;
    }

    // UserId
    public function getUserIdAttribute()
    {
        return $this->attributes['user_id'];
    }
    public function setUserIdAttribute($user_id)
    {
        $this->attributes['user_id'] = $user_id;
    }

    // Default
    public function getDefaultAttribute()
    {
        return $this->attributes['is_default'];
    }
    public function setDefaultAttribute($is_default)
    {
        $this->attributes['is_default'] = $is_default;
    }

    // ...

}

When I call attributes in my macbook's artisan tinker I get this results:

>>> $p = App\Models\PressReviewPreset::first()
=> App\Models\PressReviewPreset {#810
     id: 41,
     user_id: 391,
     name: "DEMO",
     is_default: 1,
     last_update: "2017-03-10 14:32:39",
     created_at: "2017-03-10 14:27:24",
     deleted_at: null,
   }
>>> $p->id
=> 41
>>> $p->user_id
=> 391
>>> $p->userId
=> 391
>>> $p->is_default
=> 1
>>> $p->default
=> 1

All values are correctly integer.

But if I call same attributes on my staging server I get this results:

>>> $p = App\Models\PressReviewPreset::first()
=> App\Models\PressReviewPreset {#810
     id: "41",
     user_id: "391",
     name: "DEMO",
     is_default: "1",
     last_update: "2017-03-10 14:32:39",
     created_at: "2017-03-10 14:27:24",
     deleted_at: null,
   }
>>> $p->id
=> "41"
>>> $p->user_id
=> "391"
>>> $p->userId
=> "391"
>>> $p->is_default
=> 1
>>> $p->default
=> "1"

Why user_id is not correctly casted to integer?

Am I doing somethings wrong?

Thanks in advance!

like image 565
Tenaciousd93 Avatar asked Oct 29 '22 10:10

Tenaciousd93


1 Answers

What about in your attributes, you cast it again ?

public function getIdAttribute()
{
    return (int) $this->attributes['id'];
}

Any luck?

like image 94
EddyTheDove Avatar answered Nov 04 '22 10:11

EddyTheDove