Сценарии установки: создание таблиц и обновление существующих

22

У меня был один вопрос, недавно я разрабатывал один модуль с большим количеством таблиц в БД, и концепция часто менялась, поэтому было необходимо изменить существующие таблицы в БД, и я заметил разницу в создании сценариев и обновлении таблиц. Ну вот. Посмотрите на создание кода таблицы ниже:

$table = $installer->getConnection()
    ->newTable($installer->getTable('module/table'))
    ->addColumn('id', Varien_Db_Ddl_Table::TYPE_INTEGER, 9, array(
        'nullable' => false,
        'primary' => true,
        'identity' => true,
        'auto_increment' => true
    )
);

Новая_таблица () экземпляр функция возвращает из Varien_Db_Ddl_Table и модернизация стола сценария использует другой способ , чтобы добавить новый столбец в существующую таблицу, посмотри:

$installer->getConnection()
    ->addColumn($tableName, 'test', array(
        'nullable' => false,
        'length' => 9,
        'type' => Varien_Db_Ddl_Table::TYPE_INTEGER,
        'comment' => 'Test Field'
    )
)

эти две функции addColumn различны, а также являются методами разных классов, и они меня огорчают каждый раз, когда мне нужно изменить синтаксис.
Итак, вот вопрос, есть ли способ обновить существующую таблицу, используя экземпляр класса Varien_Db_Ddl_Table ?

Ник
источник

Ответы:

15

Похоже, что нет способа изменить существующую таблицу, используя объект Varien_Db_Ddl_Table. Если вы зайдете в код для этого класса, вы не увидите области, в которой он использует существующую схему для таблицы, или проверяет, существует ли таблица каким-либо образом. Это будет необходимо, если вы будете использовать его для изменения таблицы.

Кроме того, в Varien_Db_Adapter_Interface нет метода, аналогичного «updateTable», который принимает объект Varien_Db_Ddl_Table в качестве параметра.

Это определенно один из тех «запахов кода» в Magento, поскольку у вас есть два совершенно разных блока кода, пытающихся выполнить одно и то же разными способами. Приведет только к ошибкам.

Тим Рейнольдс
источник
хороший ответ, я так и думал, спасибо :)
Ник
2
А теперь сделайте запрос на извлечение Magento 2, чтобы это исправить :-)
Alex
6

Если это входит в рамки проекта, вы можете захотеть перейти на модель EAV, если модель меняется очень часто, как вы упомянули. Это поможет вам избежать путаницы при переносе данных туда-сюда. Вот статья, которая объясняет основы EAV в Magento, чтобы вы могли оценить ее и решить, подходит ли она для вашего проекта.

mybluevan
источник