¿Cómo agregar una nueva columna a la tabla existente en Magento mediante programación?

23

¿Cómo puedo agregar una nueva columna a la tabla principal de Magento existente mediante el script de instalación? (sin usar SQL puro)

Quiero usar la forma Magento, que utiliza métodos de alias para crear el script de instalación.

Hasta ahora seguí algunos tutoriales. Pero parece que no funciona correctamente. Esta TABLA DE ALTERACIÓN de StackOverflow en el script de configuración de Magento sin usar la respuesta de SQL fue algo similar a mi pregunta. Pero, ¿cuál es el contenido que se debe poner en el confg.xmlarchivo del módulo ? ¿Debo definir simplemente el modelo de recursos, el modelo y los datos de configuración serían suficientes?

La parte relevante de config.xml(de mi módulo) es la siguiente.

<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>

Y mi script de instalación es el siguiente.

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

Pero obtengo el siguiente error.

SQLSTATE [42S02]: tabla base o vista no encontrada: 1146 La tabla '255.sales_flat_order' no existe

Cualquier sugerencia para solucionar esto sería apreciada.

Sukeshini
fuente
¿El nombre de la base de datos 255?
Fabian Blechschmidt
no. El nombre de la base de datos es otra cosa.
Sukeshini

Respuestas:

44

sales_flat_orderes el nombre completo de tabley, por lo tanto, debe usar alias en$installer->getTable()

En $installer->getTable()parámetro comomodule_alias/table_alias.

En ese caso intente con

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

Cuando escriba esto, devolverá el nombre de la tabla sales_flat_order

porque

module_alias = sales

table_alias = order

EDITAR

Puede usar el siguiente script para agregar una nueva columna. Funciona bien en mi 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();

Estoy usando Varien_Db_Ddl_Table::TYPE_TEXTinsted Varien_Db_Ddl_Table::TYPE_VARCHARporque TYPE_VARCHARestá en desuso

Puedes comprobar @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

Y si especifica el tipo TYPE_TEXTpero establece la longitud para que digamos que 255Magento creará una MySQLcolumna de VARCHARtipo.

Keyur Shah
fuente
probé esto, a pesar de que
obtengo
@Sukeshini revisa mi edición ...
Keyur Shah
Muchas gracias. Funcionó perfectamente y +1 por el esfuerzo que hizo para resolver mi problema.
Sukeshini
Me alegra saber que te funciona @Sukeshini
Keyur Shah
@KeyurShah ¿cómo agregar un nuevo campo en una tabla personalizada?
Mariposa
5

Estás haciendo mal uso del método addColumn:

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

el cuarto parámetro es el nombre del esquema, en su llamada, el cuarto parámetro es 255.

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

Si usa los parámetros correctos, debería funcionar.

Fabian Blechschmidt
fuente
1
TYPE_VARCHAR está en desuso, por lo que tenemos que usar TYPE_TEXT según Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes. ,, corrígeme si estoy equivocado. @Fabian
Keyur Shah
Tienes razón. TYPE_TEXT con una longitud <255 maximiza automáticamente un varchar.
Fabian Blechschmidt
@Fabian Blechschmidt: Gracias por señalar los lugares perdidos. y +1
Sukeshini
4

Me doy cuenta de que esta es una pregunta relativamente "antigua", pero como Google todavía la puede encontrar, decidí agregar esta información.

Con respecto a su pregunta, si desea cambiar la tabla de ventas / pedidos, esto no debe hacerse mediante los scripts / instalación de instalación tradicionales. El Mage_Catalogmódulo usa una Resource_Setupclase diferente , a saber Mage_Sales_Model_Resource_Setup.

Si desea agregar atributos al modelo de ventas / pedidos, para asegurarse de que todo se agrega y procesa correctamente, agregue su atributo de esta manera:

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

Si se pregunta por qué , entonces la respuesta está dentro de la addAttribute()función de la Mage_Sales_Model_Resource_Setupclase:

/**
 * 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
fuente
Good Catch .. Nunca se sabe que podemos usar addAttributepara el módulo Sales_Order
Rajeev K Tomy
Esta es realmente la respuesta más correcta.
fantástico
Estaba usando el $thisinstalador, su respuesta me indicó la dirección correcta. Muchas gracias!
Dr. Gianluigi Zane Zanettini