Как сделать миграцию перечисления полей yii2

Я создаю поле ENUM, и результатом является ошибка, когда я использую yii migrate/up в окнах CMD.

public function up()
{
    $tableOptions = null;
    if ($this->db->driverName === 'mysql') {
        $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
    }

    $this->createTable('{{%user_social_media}}', [
        'social_media' => $this->ENUM('facebook', 'google', 'twitter', 'github'),
        'id' => $this->primaryKey(),
        'username' => $this->string(),
        'user_id' => $this->integer(11),
        'created_at' => $this->integer(11),
        'updated_at' => $this->integer(11),            
       ], $tableOptions);
}

When I migrate/up error

Ответ 1

В настоящее время нет метода enum(), поскольку не каждая БД поддерживает поля ENUM. Вы можете сделать это вручную, хотя:

'social_media' => "ENUM('facebook', 'google', 'twitter', 'github')",

Примечание: Это решение только для Mysql

Для соответствующего содержания Postgresql посетите здесь

Ответ 2

На самом деле лучший способ сделать это и сохранить чистоту миграций - использовать какой-нибудь инструмент/помощник, подобный тому, который предоставлен командой yii2mod https://github.com/yii2mod/yii2-enum

таким образом, вы можете построить функциональность enum на коде, работает как шарм.

то есть перечисление для гендерного типа

<?php

namespace common\models\enums;

use yii2mod\enum\helpers\BaseEnum;

/**
 * Class GenderType
 *
 * @package yii2mod\settings\models\enumerables
 */
class GenderType extends BaseEnum
{
    // add as many genders as you need
    const MALE_TYPE = 'MALE';
    const FEMALE_TYPE = 'FEMALE';

    public static $list = [
        self::MALE_TYPE => 'Male',
        self::FEMALE_TYPE => 'Female',
    ];
}

Используйте следующие методы для доступа к своему Enum:

  • createByName() - создает новый экземпляр типа, используя имя стоимость.
  • getValueByName() - возвращает постоянный ключ по значению (метке)
  • createByValue() - создает новый экземпляр типа, используя значение.
  • listData() - возвращает ассоциативный массив со значениями констант и этикетки
  • getLabel() - возвращает метку константы по ключу
  • getConstantsByName() - возвращает список констант (по имени) для этот тип.
  • getConstantsByValue() - возвращает список констант (по значение) для этого типа.
  • isValidName() - Проверяет, является ли имя действительным для этот тип. isValidValue() - Проверяет, является ли значение допустимым для этого типа.