MasterGerold
@MasterGerold

Как работать с полем SET в Yii2?

Доброго времени суток!
Подскажите пожалуйста, у меня есть поле в БД с типом SET. Как мне в него передать значения с помощью ActiveForm.
Пробовал вот так:
<?= $form->field($model, 'communication')->checkboxList(['Свет' => 'Свет', 'Газ' => 'Газ', 'Вода' => 'Вода']) ?>

Так ничего не получается. Выдает ошибку. Подскажите как это реализовать. Заранее благодарен!
  • Вопрос задан
  • 489 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
На текущий момент Yii2 не поддерживает полноценную работу с типом SET MySQL. Но Вы можете реализовать самостоятельно логику работы с данным типом дополнив Ваш класс ActiveRecord, например:

/**
 * Ваш класс ActiveRecord описывающий таблицу содержащую поле с типом SET
 *
 * @property string $communication Название поля в таблице хранящее SET-значения
 * @property string[] $communicationArr Атрибут который будет обрабатывать все значения в виде массива
 */
class MyAR extends \yii\db\ActiveRecord
{

    /**
     * Формирование правил валидации атрибутов
     */
    public function rules()
    {
        return [
            // Ваши правила валидации атрибутов
            [
                // правило валидации для поля типа SET
                'communication',
                'string'
            ]
        ];
    }

    /**
     * Формирование списка безопастных атрибутов
     */
    public function scenarios()
    {
        return [
            $this::SCENARIO_DEFAULT => [
                // Список атрибутов которые можно загружать через метод load
                'communicationArr'
            ] // атрибут с которым будем работать как с массивом

        ];
    }

    /**
     * Геттер свойства сommunicationArr
     */
    public function getCommunicationArr()
    {
        return explode(',', $this->communication);
    }

    /**
     * Cеттер свойства сommunicationArr
     */
    public function setCommunicationArr($value)
    {
        $this->communication = is_array($value) ? implode(',', $value) : '';
    }
}


а дальше просто работаете с атрибутом communicationArr ...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Переведите всё в цифры, не строки.
1 = 'Свет',
2 = 'Газ'
3 = 'Вода'
и так далее
Соответственно в базе данных тип поля поменяйте на integer
В модели создаёте статический метод, который возвращает массив
public static function getAllData()
{
   return [
       1 => 'Свет',
       2 => 'Газ',
      3 => 'Вода'
  ];
}

В checkboxList просто вызываете этот метод
<?= $form->field($model, 'communication[]')->checkboxList(Model::getAllData()) ?>
Обратите внимание на квадратные скобки у communication
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы