How to add new column to existing table in Magento programmatically?
sales_flat_order
is the full name of the table
and so you have to use alias in $installer->getTable()
In $installer->getTable()
parameter like module_alias/table_alias.
In that case try with
$installer->getTable('sales/order')
When you write this it will return table name sales_flat_order
because
module_alias = sales
table_alias = order
EDIT
You can use below script to add new column. It works fine in my system
$installer = $this;
$installer->startSetup();
$installer->getConnection()
->addColumn($installer->getTable('sales/order'),'custom_value', array(
'type' => Varien_Db_Ddl_Table::TYPE_TEXT,
'nullable' => false,
'length' => 255,
'after' => null, // column name to insert new column after
'comment' => 'Title'
));
$installer->endSetup();
I am using Varien_Db_Ddl_Table::TYPE_TEXT
insted of Varien_Db_Ddl_Table::TYPE_VARCHAR
because TYPE_VARCHAR
is deprecated
You can check @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes
And If you specify type TYPE_TEXT
but set length to lets say 255
Magento will create a MySQL
column of VARCHAR
type.
You are misusing the method addColumn
:
public function addColumn($tableName, $columnName, $definition, $schemaName = null)
the fourth parameter is the schemaName, in your call, the fourth parameter is 255
.
->addColumn($installer->getTable('sales_flat_order'),'custom_value', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array(
'nullable' => false,
), 'Title')
If you use the right parameters, it should work.
I realize this is a relatively 'old' question, but as it's still pretty find-able by Google, I decided to add this bit of information.
Regarding your question, if you want to change the sales/order table, this should not be done by the traditional install scripts/setup. The Mage_Catalog
module uses a different Resource_Setup
class, namely Mage_Sales_Model_Resource_Setup
.
If you want to add attributes to the sales/order model, in order to ensure everything is added and processed correctly, add your attribute like this:
<?php
// Start setup
/** @var Mage_Sales_Model_Resource_Setup $installer */
$installer = new Mage_Sales_Model_Resource_Setup('core_setup');
$installer->startSetup();
// Gather info
$entityType = 'order'; // Adding attribute to this entity type (must be written out in text, not the entity type ID!! That'll not work.
$attributeName = 'my_attribute_code'; // Your attribute code/name
// Add attribute, very few parameters are accepted.
$installer->addAttribute($entityType, $attributeName, array(
'type' => 'varchar'
));
// End setup
$installer->endSetup();
Should you wonder why, then the answer is within the addAttribute()
function of the Mage_Sales_Model_Resource_Setup
class:
/**
* Add entity attribute. Overwrited for flat entities support
*
* @param int|string $entityTypeId
* @param string $code
* @param array $attr
* @return Mage_Sales_Model_Resource_Setup
*/
public function addAttribute($entityTypeId, $code, array $attr)
{
if (isset($this->_flatEntityTables[$entityTypeId]) &&
$this->_flatTableExist($this->_flatEntityTables[$entityTypeId]))
{
$this->_addFlatAttribute($this->_flatEntityTables[$entityTypeId], $code, $attr);
$this->_addGridAttribute($this->_flatEntityTables[$entityTypeId], $code, $attr, $entityTypeId);
} else {
parent::addAttribute($entityTypeId, $code, $attr);
}
return $this;
}