一尘不染

不使用SQL的Magento安装脚本中的ALTER TABLE

php

“更新不应采用SQL命令的形式”。我没有遇到任何无法通过Magento的配置结构执行的DDL或DML语句。

我想知道如何最好地以这种方式在表中添加/修改/删除表中的列或索引,但又不依赖SQL?可能吗

此外,只能在SQL中执行哪些其他操作?


阅读 242

收藏
2020-05-29

共1个答案

一尘不染

您可以在安装脚本中使用以下方法:

  • 使用Varien_Db_Ddl_Tableclass创建新表,您可以在其中结合$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-列的定义(INT(10)DECIMAL(12,4)等)
    • addConstraint()方法创建一个新的约束外键。它有这样的参数
    • $fkName-外键名称在每个数据库中应该是唯一的,如果不指定FK_前缀,它将自动添加
    • $tableName -用于添加外键的表名
    • $columnName -应该引用到另一张表的列名,如果您具有复杂的外键,请使用逗号指定多个列
    • $refTableName -外部表名,将被处理
    • $refColumnName -外部表中的列名
    • $onDelete-对删除外部表中的行的操作。可以为空字符串(不执行任何操作)cascade、、set null。该字段是可选的,如果未指定,cascade将使用value。
    • $onUpdate外表中行键更新的操作。可以为空字符串(不执行任何操作)cascade、、set null。该字段是可选的,如果未指定,cascade将使用value。
    • $purge -用于在添加外键后清除行的标志(例如,删除未引用的记录)
    • addKey()方法用于向表添加索引。它具有以下参数:
    • $tableName -应该在其中添加索引的表名
    • $indexName -索引名称
    • $fields -索引中使用的列名
    • $indexType-索引的类型。可能的值有:indexuniqueprimaryfulltext。此参数是可选的,因此默认值为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-新的引擎名称(MEMORYMyISAMInnoDB等)

您也可以使用tableColumnExistsmethod检查该列的存在。

它不是摆脱直接SQL查询编写的可用方法的完整列表。您可以在Varien_Db_Adapter_Pdo_MysqlZend_Db_Adapter_Abstract类中找到更多信息。

不要犹豫,将要使用的类定义,可以为自己找到很多有趣的东西:)

2020-05-29