taral
@taral
php программист

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

Мне потребовалось работать с некоторыми атрибутами как с массивами.
К примеру есть список чекбоксов
<?= $form->field($model, 'parents')->checkboxList([1=>'значение 1', 2=>'значение 2', 3=>'значение 3']); ?>

А этом случае постом в модель отправляется массив. А в базу естественно мы можем писать только строку.
Я пробовал разные варианты решения. Сейчас пришло в голову такое.
1. Создаю валидатор который проверяет что бы значение было только массивом и ставлю его на поле parents
2. Переопределяю базовую модель ActiveRecord
...
    public function typeArrayAttributes()
    {
        return ['parents'];
    }

    public function __get($name)
    {
        $value = parent::__get($name);
        if(in_array($name, $this->typeArrayAttributes())) {
            $value = empty($value) ? [] : explode(',', $value);
        }
        return $value;
    }

    public function __set($name, $value)
    {
        if(is_array($value) && in_array($name, $this->typeArrayAttributes())) {
            $value = implode(',', $value);
        }
        parent::__set($name, $value);
    }
...

Метод typeArrayAttributes определяет список атрибутов значения которых только массивы.
Теперь я через $model->parents получаю сразу массив а не строку. И присваивать могу тоже только массивы $model->parents = ['значение 1', 'значение 2'];
На данном этапе меня все устраивает. Но поскольку я видоизменил базовую работу модели могут быть нюансы которые я не учел. Про это и вопрос.
P.S. предрекая возможные вопросы сообщаю что я знаю что такое связи many_many и активно их использую. Но в этом случае мне нужно работать с некоторыми полями как с массивами.
Спасибо!
  • Вопрос задан
  • 2275 просмотров
Пригласить эксперта
Ответы на вопрос 1
reffy
@reffy
Я молодец.
А почему не сделать это в рамках валидатора и статических методов модели? Типа как в примере создание блога на Yii — yiiframework.ru/doc/blog/ru/post.model

Зачем вообще __set и __get? Зачем трогать базовую модель ActiveRecord?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы