Como adicionar uma nova coluna à tabela existente no Magento programaticamente?

23

Como posso adicionar uma nova coluna à tabela principal do Magento via script de instalação? (sem usar SQL puro)

Eu quero usar a maneira Magento, que está usando métodos de alias para criar script de instalação.

Até agora eu segui alguns tutoriais. Mas parece não estar funcionando corretamente. Este StackOverflow ALTER TABLE no script de instalação do Magento sem usar a resposta SQL foi um pouco semelhante à minha pergunta. Mas qual é o conteúdo que deve ser colocado no confg.xmlarquivo do módulo ? Preciso apenas definir o modelo de recursos, o modelo e os dados de configuração seriam suficientes?

A parte relevante do config.xml(do meu módulo) é a seguinte.

<config>
 . . . 
<global>
        <models>
            <mymodule>
                <class>Mynamespace_Mymodule_Model</class>
                <resourceModel>mymodule_resource</resourceModel>
            </mymodule>
            <mymodule_resource>
                <class>Mynamespace_Mymodule_Model_Resource</class>
            </mymodule_resource>
        </models>
        <resources>
            <mymodule_setup>
                <setup>
                    <module>Mynamespace_Mymodule</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </mymodule_setup>
            <mymodule_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </mymodule_read>
            <mymodule_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </mymodule_write>
        </resources>
. . . .
</config>

E meu script de instalação é o seguinte.

$installer = $this;
$installer->startSetup();

$installer->getConnection()
        ->addColumn($installer->getTable('sales_flat_order'),'custom_value', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array(
        'nullable'  => false,
), 'Title');
$installer->endSetup();

Mas estou recebendo o seguinte erro.

SQLSTATE [42S02]: Tabela base ou exibição não encontrada: 1146 A tabela '255.sales_flat_order' não existe

Qualquer sugestão para corrigir isso seria apreciada.

Sukeshini
fonte
O nome do banco de dados é 255?
Fabian Blechschmidt
não. nome do banco de dados é outra coisa.
Sukeshini

Respostas:

44

sales_flat_orderé o nome completo do tablee, portanto, você deve usar o alias no$installer->getTable()

No $installer->getTable()parâmetro comomodule_alias/table_alias.

Nesse caso, tente com

$installer->getTable('sales/order')

Quando você escreve isso, ele retornará o nome da tabela sales_flat_order

Porque

module_alias = sales

table_alias = order

EDITAR

Você pode usar o script abaixo para adicionar uma nova coluna. Funciona bem no meu sistema

$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();

estou usando Varien_Db_Ddl_Table::TYPE_TEXT insted Varien_Db_Ddl_Table::TYPE_VARCHARporque TYPE_VARCHARestá obsoleto

Você pode checar @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

E Se você especificar o tipo, TYPE_TEXTmas definir o comprimento como, digamos, o 255Magento criará uma MySQLcoluna do VARCHARtipo.

Keyur Shah
fonte
tentei isso, mesmo que eu esteja recebendo a mesma resposta
Sukeshini 3/15
@Sukeshini check my edit ....
Keyur Shah
Muito obrigado. Funcionou perfeitamente e marcou com +1 o esforço que você fez para resolver meu problema.
Sukeshini 4/15
feliz em saber que ele funciona para você @Sukeshini
Keyur Shah
@KeyurShah como adicionar um novo campo à tabela personalizada?
Butterfly
5

Você está usando incorretamente o método addColumn:

public function addColumn($tableName, $columnName, $definition, $schemaName = null)

o quarto parâmetro é o schemaName, na sua chamada, o quarto parâmetro é 255.

->addColumn($installer->getTable('sales_flat_order'),'custom_value', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255, array(
    'nullable'  => false,
), 'Title')

Se você usar os parâmetros corretos, deve funcionar.

Fabian Blechschmidt
fonte
1
TYPE_VARCHAR foi descontinuado, portanto, precisamos usar TYPE_TEXT conforme Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes ., me corrija se estiver errado. @Fabian
Keyur Shah
Você está certo. TYPE_TEXT com um comprimento <255 no máximo automaticamente um varchar.
Fabian Blechschmidt
@Fabian Blechschmidt: Obrigado por apontar os lugares perdidos. e +1
Sukeshini
4

Sei que essa é uma pergunta relativamente "antiga", mas como ainda é bastante acessível pelo Google, decidi adicionar esse pouco de informação.

Em relação à sua pergunta, se você deseja alterar a tabela de vendas / pedidos, isso não deve ser feito pelos scripts / instalações de instalação tradicionais. O Mage_Catalogmódulo usa uma Resource_Setupclasse diferente , a saberMage_Sales_Model_Resource_Setup .

Se você deseja adicionar atributos ao modelo de vendas / pedidos, para garantir que tudo seja adicionado e processado corretamente, adicione seu atributo assim:

<?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();

Se você se perguntar por que , então a resposta está dentro da addAttribute()função da Mage_Sales_Model_Resource_Setupclasse:

/**
 * 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;
}
Wesley Vestjens
fonte
Boa captura .. Nunca sei que podemos usar addAttributepara o módulo Sales_Order
Rajeev K Tomy
Esta é realmente a resposta mais correta.
fantasticrice
Eu estava usando o $thisinstalador, sua resposta me indicou a direção certa. Muito obrigado!
Dr. Gianluigi Zane Zanettini