web-dev-qa-db-ja.com

フィールド列挙型移行を行う方法yii2

フィールドENUMを作成し、CMDウィンドウでyii migrate/upを使用すると結果がエラーになります。

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

15
CrashBurn

すべてのDBがENUMフィールドをサポートしているわけではないため、現時点ではenum()メソッドはありません。あなたはそれを手動で行うことができます:

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

注:このソリューションはMysql専用です

関連するPostgresqlコンテンツについては ここ をご覧ください

34
Bizley

実際にこれを実行して移行をクリーンに保つ最良の方法は、yii2modチームが提供するツールやヘルパーを使用することです https://github.com/yii2mod/yii2-enum

このようにして、コードの列挙型機能を構築でき、魅力のように機能します。

つまり、genderTypeの列挙型

<?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()-value(label)によって定数キーを返します
  • createByValue()-値を使用して新しいタイプのインスタンスを作成します。
  • listData()-定数値とラベルを持つ連想配列を返します
  • getLabel()-キーによって定数ラベルを返します
  • getConstantsByName()-この型の定数のリストを(名前で)返します。
  • getConstantsByValue()-この型の定数のリストを(値で)返します。
  • isValidName()-このタイプで名前が有効かどうかを確認します。 isValidValue()-値がこのタイプに有効かどうかを確認します。
1
Pablo Palacios