Мне потребовалось работать с некоторыми атрибутами как с массивами.
К примеру есть список чекбоксов
<?= $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 и активно их использую. Но в этом случае мне нужно работать с некоторыми полями как с массивами.
Спасибо!