Указать кодировку при создании таблицы в Yii2

02-12-2018
post-image

Многие знают про миграции во фреймвроке Yii2, но не многие знают про дополнительные параметры у $this->createTable. В этой статье расскажу как указать кодировку, которая "понимает" русские буквы в базе данных.

Создание миграции

Думаю тут ничего новго для вас нет. В консоле пишем код на создание миграции, которая будет отвечать за генерацию таблицы в БД:

php yii migrate/create create_table_category

После генерации миграционного файлика, открваем его на редактирование. И видем уже сгенерированный код, примерно такой:


...

public function safeUp()
{

}
/**
 * {@inheritdoc}
 */
public function safeDown()
{
    echo "m181202_184136_create_table_category cannot be reverted.\n";

    return false;
}

...

Собственно это код миграции (safeUp()) и код её отката (safeDown()). Продолжаем работать с функцией safeUp(). В неё пишем код на создание таблицы в БД. Примерно такой:


$this->createTable('category', [
    'id' => $this->primaryKey(),
    'image' => $this->string(),
    'title' => $this->string()->notNull(),
    'description' => $this->text(),
    'body' => $this->text(),
]);

Так вот, теперь самое интересное:

Задаём кодировку, которая понимает русские буквы

Для этого перед $this->createTable пишем следующее:


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

Т.е. объявляем переменную $tableOptions, в которой будем харнить параметры кодировки нашей таблицы. Потом спрашиваем "если драйвер для работы с БД === mySQL", тогда... на mySQL'шном языке объясняем что нам нужна кодировка, поддерживающая отечественные буквы.

После этого надо нашу переменную $tableOptions куда-то впихнуть. А делается это как раз при помощи дополнительного параметра у $this->createTable. После чего код миграции на генерацию таблицы в БД, которая будет поддерживать русские буквы будет выглядить так:


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

$this->createTable('category', [
    'id' => $this->primaryKey(),
    'image' => $this->string(),
    'title' => $this->string()->notNull(),
    'description' => $this->text(),
    'body' => $this->text(),
], $tableOptions);

Если помог, поделись с друзьями в соцСетях. А то получается я этот функционал пили просто так =( Если поделишься, приятным бонусом будет анекдот ;)


Поделился? Читай дальше =)

Есть что сказать? Давай:

Комментарии:

Нет комментариев =( Так быть не должно!
Напиши что-нибудь хорошее =)

Будь в курсе