Come aggiungere una nuova colonna alla tabella esistente in Magento a livello di codice?


23

Come posso aggiungere una nuova colonna alla tabella principale di Magento esistente tramite lo script di installazione? (senza usare SQL puro)

Voglio usare il modo Magento che utilizza metodi alias per creare script di installazione.

Finora ho seguito alcuni tutorial. Ma sembra non funzionare correttamente. Questo StackOverflow ALTER TABLE nello script di installazione di Magento senza usare la risposta SQL era in qualche modo simile alla mia domanda. Ma qual è il contenuto dovrebbe essere messo nel confg.xmlfile del modulo ? Devo solo definire il modello di risorsa, il modello e i dati di configurazione sarebbero sufficienti?

La parte rilevante del config.xml(del mio modulo) è la seguente.

<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 il mio script di installazione è il seguente.

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

Ma sto ricevendo il seguente errore.

SQLSTATE [42S02]: Tabella di base o vista non trovata: 1146 La tabella '255.sales_flat_order' non esiste

Qualsiasi suggerimento per risolvere questo sarebbe apprezzato.


Il nome del database è 255?
Fabian Blechschmidt,

no. il nome del database è qualcos'altro.
Sukeshini,

Risposte:


44

sales_flat_orderè il nome completo di tablee quindi devi usare l'alias in$installer->getTable()

In $installer->getTable()parametri comemodule_alias/table_alias.

In tal caso, prova con

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

Quando scrivi questo restituirà il nome della tabella sales_flat_order

perché

module_alias = sales

table_alias = order

MODIFICARE

Puoi usare lo script seguente per aggiungere una nuova colonna. Funziona bene nel mio 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();

Sto usando Varien_Db_Ddl_Table::TYPE_TEXTinsted of Varien_Db_Ddl_Table::TYPE_VARCHARperché TYPE_VARCHARè deprecato

Puoi controllare @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

E se specifichi il tipo TYPE_TEXTma imposti la lunghezza per dire che 255Magento creerà una MySQLcolonna di VARCHARtipo.


provato questo, anche se sto ottenendo la stessa risposta
Sukeshini,

@Sukeshini controlla la mia modifica ....
Keyur Shah,

Grazie mille. Ha funzionato perfettamente e +1 per lo sforzo che hai fatto per risolvere il mio problema.
Sukeshini,

felice di sapere che funziona per te @Sukeshini
Keyur Shah

@KeyurShah come aggiungere un nuovo campo nella tabella personalizzata?
Butterfly,

5

Stai abusando del metodo addColumn:

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

il quarto parametro è lo schemaName, nella tua chiamata, il quarto parametro è 255.

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

Se usi i parametri giusti, dovrebbe funzionare.


1
TYPE_VARCHAR è obsoleto, quindi dobbiamo usare TYPE_TEXT secondo Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes. Correggimi se sbaglio. @Fabian
Keyur Shah,

Hai ragione. TYPE_TEXT con una lunghezza <255 max automaticamente un varchar.
Fabian Blechschmidt

@Fabian Blechschmidt: Grazie per aver segnalato i posti persi. e +1
Sukeshini,

4

Mi rendo conto che questa è una domanda relativamente "vecchia", ma dato che è ancora abbastanza reperibile da Google, ho deciso di aggiungere questo po 'di informazioni.

Per quanto riguarda la tua domanda, se desideri modificare la tabella vendite / ordini, ciò non dovrebbe essere fatto con gli script / le impostazioni di installazione tradizionali. Il Mage_Catalogmodulo utilizza una Resource_Setupclasse diversa , vale a dire Mage_Sales_Model_Resource_Setup.

Se desideri aggiungere attributi al modello di vendita / ordine, al fine di garantire che tutto sia aggiunto ed elaborato correttamente, aggiungi il tuo attributo in questo modo:

<?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 ti chiedi perché , allora la risposta è nella addAttribute()funzione della 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;
}

Buona cattura .. Non so mai che possiamo usare addAttributeper il modulo Sales_Order
Rajeev K Tomy,

Questa è in realtà la risposta più corretta.
fantastico

Stavo usando l' $thisinstaller, la tua risposta mi ha indicato la giusta direzione. Grazie mille!
Dr. Gianluigi Zane Zanettini,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.