Страница 1 из 1

ALTER TABLE в миграциях

Добавлено: 2019.07.10, 10:20
Chelobaka
Здравствуйте, на рабочем проекте были созданы ряд таблиц с неправильной кодировкой. Есть ли возможность сделать миграции по смене кодировки во всех таблицы базы данных? Возможно можно запустить свой sql запрос без использования $this

В документации нашел только на смену кодировки полей.

Re: ALTER TABLE в миграциях

Добавлено: 2019.07.10, 10:31
masson
В yii\db\Schema есть имена всех таблиц БД.
Проходишь по ним циклом и выполняешь Yii::$app->db->createCommand('ALTER TABLE ... Bla-bla-bla')->execute();

Re: ALTER TABLE в миграциях

Добавлено: 2019.07.10, 16:53
Chelobaka
masson писал(а): 2019.07.10, 10:31 В yii\db\Schema есть имена всех таблиц БД.
Проходишь по ним циклом и выполняешь Yii::$app->db->createCommand('ALTER TABLE ... Bla-bla-bla')->execute();
Я бы и рад но yii\db\Schema не понимаю как использовать.
В документации написано публичное свойство. НО.

Код: Выделить всё

$dbSchema = new Schema();
$dbSchema->schemaNames;
Возвращает ошибку.

'yii\base\NotSupportedException' with message 'yii\db\mysql\Schema does not support fetching all schema names.'

Re: ALTER TABLE в миграциях

Добавлено: 2019.07.10, 16:57
proctoleha
Chelobaka писал(а): 2019.07.10, 10:20 Возможно можно запустить свой sql запрос без использования $this

Код: Выделить всё

<?php

use yii\db\Migration;

class m190710_062228_change_coming extends Migration
{
    public function safeUp()
    {
        $sql = "ALTER TABLE `coming_document`
        DROP FOREIGN KEY `fk-coming_document_shipping_number-id`;
        ALTER TABLE `coming_document`
        DROP `shipping_number_id`,
        DROP `confirmed`;
        ALTER TABLE `coming_document`
        ADD `order_id` int(11) NULL AFTER `user_id`,
        ADD FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`);";

        $this->execute($sql);
    }

    public function safeDown()
    {
    }
}

Re: ALTER TABLE в миграциях

Добавлено: 2019.07.10, 19:32
Chelobaka
proctoleha писал(а): 2019.07.10, 16:57
Chelobaka писал(а): 2019.07.10, 10:20 Возможно можно запустить свой sql запрос без использования $this

Код: Выделить всё

<?php

use yii\db\Migration;

class m190710_062228_change_coming extends Migration
{
    public function safeUp()
    {
        $sql = "ALTER TABLE `coming_document`
        DROP FOREIGN KEY `fk-coming_document_shipping_number-id`;
        ALTER TABLE `coming_document`
        DROP `shipping_number_id`,
        DROP `confirmed`;
        ALTER TABLE `coming_document`
        ADD `order_id` int(11) NULL AFTER `user_id`,
        ADD FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`);";

        $this->execute($sql);
    }

    public function safeDown()
    {
    }
}
Спасибо но проблема в cascade удалении. В общем делать что то в роде копирования в вспомогательную таблицу, удалять ключ, менять кодировку, заливать данные, восстанавливать ключ полный геморой. Лучше все инициализировать изначально.

Re: ALTER TABLE в миграциях

Добавлено: 2019.07.11, 08:33
masson
Выполнить команду set foreign_key_checks=0, удалить записи, потом опять вернуть =1