Laravel по-русски

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

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

#1 15.02.2019 10:26:30

Кастинг некоторых записей (талица site_settings)

Прошу совета:

У меня есть редактируемые параметры сайта. Сейчас это хранится как таблица с единственной записью из 45 полей. И есть тенденция к росту smile Я хочу "перевернуть" её чтобы получить таблицу из двух колонок вида (имя, значение). Так как значения могут быть самыми разными, я беру тип text. Кеширование оставим пока в стороне, вопрос про преобразование типов. Если в сещуствующей структуре я для облаботки селиализованного значения я могу просто додавить имя поля в свойство $casts, то в новой структуре я теряю такое удобство.

Есть ли готовые решения для кастования значений из некоторых записей, а не из полей?


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#2 15.02.2019 12:19:42

Re: Кастинг некоторых записей (талица site_settings)

Как вариант добавить третью колонку для хранения типа каста.
ну и потом в свитче кастить в нужный формат. переопределить метод __get() или getAttribute() для модели и туда свитч этот засунуть.
больше склоняюсь ко второму методу, потому что там как раз работа с мутаторами
родная реализация метода:

    public function __get($key)
    {
        return $this->getAttribute($key);
    }

Изменено Eskono (15.02.2019 12:21:04)

Не в сети

#3 08.03.2019 23:12:28

Re: Кастинг некоторых записей (талица site_settings)

В свое время решил проблему переопределением метода 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);
    }
}

Не в сети

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