Jonathan Day表示:
“更新不应以SQL命令的形式提供”。我还没有遇到任何无法通过Magento的配置结构执行的DDL或DML语句。
(在问题如何将配置更改从开发环境迁移到生产环境?中)
我想知道如何最好地添加/修改/删除表格中的列或索引,但不依赖于SQL?这是否可能?
此外,还有哪些操作只能使用SQL完成?
Jonathan Day表示:
“更新不应以SQL命令的形式提供”。我还没有遇到任何无法通过Magento的配置结构执行的DDL或DML语句。
(在问题如何将配置更改从开发环境迁移到生产环境?中)
我想知道如何最好地添加/修改/删除表格中的列或索引,但不依赖于SQL?这是否可能?
此外,还有哪些操作只能使用SQL完成?
您可以在设置脚本中使用以下方法:
使用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
- 列的定义 (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
方法用于addAttribute
方法将导致在order_flat
表中创建一个新列。 - Ivan ChepurnyiMage_Sales_Model_Mysql4_Setup
继承以支持这些功能。 - Ivan Chepurnyi我已成功使用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
的方法。