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

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

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

Сообщение Chelobaka »

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

В документации нашел только на смену кодировки полей.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

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

Сообщение masson »

В yii\db\Schema есть имена всех таблиц БД.
Проходишь по ним циклом и выполняешь Yii::$app->db->createCommand('ALTER TABLE ... Bla-bla-bla')->execute();
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

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

Сообщение 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.'
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

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

Сообщение 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()
    {
    }
}
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

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

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

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

Сообщение masson »

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