php - ALTER TABLE в скрипте настройки Magento без использования SQL




2 Answers

Вы можете использовать такие методы в своем сценарии установки:

  • Используйте класс Varien_Db_Ddl_Table для создания новых таблиц, где вы можете настроить все поля, ключи, отношения в сочетании с $this->getConnection()->createTable($tableObject) Пример:

    /* @var $this Mage_Core_Model_Resource_Setup */
    $table = new Varien_Db_Ddl_Table();
    $table->setName($this->getTable('module/table'));
    $table->addColumn('id', Varien_Db_Ddl_Table::TYPE_INT, 10, 
                      array('unsigned' => true, 'primary' => true));
    
    $table->addColumn('name', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255);
    $table->addIndex('name', 'name');
    $table->setOption('type', 'InnoDB');
    $table->setOption('charset', 'utf8');
    
    $this->getConnection()->createTable($table);
    
  • Используйте установочное соединение ( $this->getConnection() ):

    • addColumn() добавляет новый столбец в выходящую таблицу. Он имеет такие параметры:
      • $tableName - имя таблицы, которое должно быть изменено
      • $columnName - имя столбца, которое должно быть добавлено
      • $definition - определение column ( INT(10) , DECIMAL(12,4) и т. д.)
    • addConstraint() создает новый внешний ключ ограничения. Он имеет такие параметры
      • $fkName - имя внешнего ключа, должно быть уникальным для каждой базы данных, если вы не укажете префикс FK_ , он будет добавлен автоматически
      • $tableName - имя таблицы для добавления внешнего ключа
      • $columnName - имя столбца, которое должно быть отнесено к другой таблице, если у вас есть сложный внешний ключ, используйте запятую, чтобы указать более одного столбца
      • $refTableName - имя внешней таблицы, которое будет обрабатываться
      • $refColumnName - имя столбца в внешней таблице
      • $onDelete - действие при удалении строки во внешней таблице. Может быть пустая строка (ничего не делать), cascade , set null . Это поле является необязательным, и если оно не указано, будет использовано значение cascade .
      • $onUpdate действие по обновлению ключа строки во внешней таблице. Может быть пустая строка (ничего не делать), cascade , set null . Это поле является необязательным, и если оно не указано, будет использовано значение cascade .
      • $purge - флаг для включения очистки строк после добавления внешнего ключа (например, удаление записей, на которые не ссылаются)
    • addKey() используется для добавления индексов в таблицу. Он имеет такие параметры:
      • $tableName - имя таблицы, в которое должен быть добавлен индекс
      • $indexName - имя индекса
      • $fields - имена столбцов, используемые в индексе
      • $indexType - тип индекса. Возможные значения: index , unique , primary , fulltext . Этот параметр является необязательным, поэтому значением по умолчанию является index
    • dropColumn() используется для удаления столбцов из существующей таблицы. Он имеет такие параметры:
      • $tableName - имя таблицы, которое должно быть изменено
      • $columnName - имя столбца, которое должно быть удалено
    • dropForeignKey() используется для удаления внешних ключей. Он имеет такие параметры:
      • $tableName - имя таблицы для удаления внешнего ключа
      • $fkName - имя внешнего ключа
    • dropKey() используется для удаления табличных индексов. Он имеет такие параметры:
      • $tableName - имя таблицы, в которой должен быть удален индекс
      • $keyName - имя индекса
    • Метод modifyColumn используется для изменения существующего столбца в таблице. Он имеет такие параметры:
      • $tableName - имя таблицы, которое должно быть изменено
      • $columnName - имя столбца, которое должно быть переименовано
      • $definition - новое определение столбца ( INT(10) , DECIMAL(12,4) и т. д.)
    • Метод changeColumn используется для изменения и переименования существующего столбца в таблице. Он имеет такие параметры:
      • $tableName - имя таблицы, которое должно быть изменено
      • $oldColumnName - старое имя столбца, которое должно быть переименовано и изменено
      • $newColumnName - новое имя столбца
      • $definition - новое определение столбца ( INT(10) , DECIMAL(12,4) и т. д.)
    • Метод changeTableEngine используется для изменения движка таблицы, например, из MyISAM в InnoDB. Он имеет такие параметры:
      • $tableName - имя таблицы
      • $engine - новое имя двигателя ( MEMORY , MyISAM , InnoDB и т. д.)

Также вы можете использовать метод tableColumnExists чтобы проверить наличие столбца.

Это не полный список методов, доступных для вас, чтобы избавиться от прямых запросов SQL-запросов. Вы можете найти больше в Varien_Db_Adapter_Pdo_Mysql и Zend_Db_Adapter_Abstract .

Не стесняйтесь смотреть на определение класса, которое вы собираетесь использовать, вы можете найти для себя много интересного :)

Джонатан Дэй говорит

«обновления НЕ ДОЛЖНЫ быть в форме команд SQL». Я не сталкивался с любыми статусами DDL или DML, которые не могут быть выполнены через конфигурационные структуры Magento.

(В вопросе Как перенести изменения конфигурации из среды разработки в производственную среду? )

Я хотел бы знать, как лучше добавлять / изменять / удалять столбцы или индексы в / из таблицы таким образом, но не полагаясь на SQL? Возможно ли это?

Кроме того, какие другие действия могут быть выполнены только в SQL?




Чтобы изменить таблицу и добавить столбец с помощью внешнего ключа, я использовал это успешно, используя Magento CE v1.6.1.0:

// Alter table to add column
$installer->getConnection()

        ->addColumn(
            $installer->getTable('modulekey/model'), 
            'column_name',  
            array(
                'type'      => Varien_Db_Ddl_Table::TYPE_INTEGER,
                'length'    => null,
                'unsigned'  => true,
                'nullable'  => true,
                'comment'   => 'Foreign key'
            )
        );

// Add foreign key constraint
$installer->getConnection()

        ->addForeignKey(
            $installer->getFkName( 
                'modulekey/model',  'column_name',
                'modulekey/foreign_model',  'foreign_column_name'
            ),
            $installer->getTable('modulekey/model'), 
            'column_name',
            $installer->getTable('modulekey/foreign_model'),
            'foreign_column_name',
            Varien_Db_Ddl_Table::ACTION_SET_NULL, 
            Varien_Db_Ddl_Table::ACTION_SET_NULL
        );

Это методы из Varien_Db_Adapter_Pdo_Mysql .




Related