Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 29.08.2018 17:09:46

Casts для key=>value

Коллеги, подскажите как выводить типизированные опции из таблицы типа кеу-value?

Схема таблицы:

 Schema::create('user_options', function (Blueprint $table) {
            $table->increments('id');
            $table->increments('user_id');
            $table->string('key', 128);
            $table->string('value', 128);
        });

Код модели:

class UserOption extends Model
{
    protected $fillable = [
        'key',
        'value'
    ];

    /**
     * Атрибуты, которые нужно преобразовать в нативный тип.
     *
     * @var array
     */
    protected $casts = [
        'sms_user_limit' => 'int'
    ];
}

Как сейчас получаю опции пользователя:

  $userOptions = UserOption::all()
                ->where('user_id', Auth::user()->id)
                ->pluck('value', 'key');

Сейчас все value опций выдаются как string, а хотелось бы указывать типизацию для определенных key.  К примеру для ключа sms_user_limit - выводить его значение как int, на подобии как реализован $casts в модели. Подскажите красивое решение пжлст (возможно оно уже и есть в ларавел...)

Есть сейчас:

{"success":true,"code":0,"data":{"demo":"test","sms_gateway_id":"1","sms_user_limit":"82","language":"ru"}}

Хочу получить:

{"success":true,"code":0,"data":{"demo":"test","sms_gateway_id":1,"sms_user_limit":82,"language":"ru"}}

Изменено kagatan (29.08.2018 17:26:18)

Не в сети

#2 08.09.2018 00:08:38

Re: Casts для key=>value

Сам спросил, сам ответил smile
Пока что выкрутился добавив override метода getCastType в моделе:

class UserOption extends Model
{
    protected $fillable = [
        'key',
        'value'
    ];

    /**
     * Атрибуты, которые нужно преобразовать в нативный тип.
     *
     * @var array
     */
    protected $casts = [
        'value'          => 'string',
        'sms_user_limit' => 'int'
    ];

    /**
     * Override getCastType
     * 
     * @param string $key
     * @return mixed|string
     */
    protected function getCastType($key)
    {
        if ($key == 'value' && !empty($this->casts[$this->key])) {
            return $this->casts[$this->key];
        }

        return parent::getCastType($key);
    }
}

Не в сети

Подвал раздела