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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Chelobaka
Сообщения: 87
Зарегистрирован: 2018.06.01, 09:54

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

Сообщение Chelobaka » 2019.07.10, 10:20

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

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

masson
Сообщения: 497
Зарегистрирован: 2012.07.03, 15:59

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

Сообщение masson » 2019.07.10, 10:31

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

Аватара пользователя
Chelobaka
Сообщения: 87
Зарегистрирован: 2018.06.01, 09:54

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

Сообщение Chelobaka » 2019.07.10, 16:53

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.'

Аватара пользователя
proctoleha
Сообщения: 259
Зарегистрирован: 2016.07.10, 19:00

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

Сообщение 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()
    {
    }
}
Вот за что я не люблю линукс, так это за свои кривые, временами, руки

Аватара пользователя
Chelobaka
Сообщения: 87
Зарегистрирован: 2018.06.01, 09:54

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

Сообщение Chelobaka » 2019.07.10, 19:32

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 удалении. В общем делать что то в роде копирования в вспомогательную таблицу, удалять ключ, менять кодировку, заливать данные, восстанавливать ключ полный геморой. Лучше все инициализировать изначально.

masson
Сообщения: 497
Зарегистрирован: 2012.07.03, 15:59

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

Сообщение masson » 2019.07.11, 08:33

Выполнить команду set foreign_key_checks=0, удалить записи, потом опять вернуть =1

Ответить