Jak programowo dodać nową kolumnę do istniejącej tabeli w Magento?

23

Jak mogę dodać nową kolumnę do istniejącej tabeli podstawowej Magento za pomocą skryptu instalacyjnego? (bez użycia czystego SQL)

Chcę użyć metody Magento, która używa metod aliasowych do tworzenia skryptu instalacyjnego.

Do tej pory wykonałem kilka samouczków. Ale wydaje się, że nie działa poprawnie. Ten StackOverflow ALTER TABLE w skrypcie instalacyjnym Magento bez użycia odpowiedzi SQL był nieco podobny do mojego pytania. Ale jaką treść należy umieścić w confg.xmlpliku modułu ? Czy wystarczy zdefiniować model zasobów, model i dane konfiguracji, które wystarczyłyby?

Odpowiednia część config.xml(mojego modułu) jest następująca.

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

Mój skrypt instalacyjny wygląda następująco.

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

Ale pojawia się następujący błąd.

SQLSTATE [42S02]: Nie znaleziono tabeli podstawowej lub widoku: 1146 Tabela „255.sales_flat_order” nie istnieje

Wszelkie sugestie dotyczące rozwiązania tego problemu będą mile widziane.

Sukeshini
źródło
Czy nazwa bazy danych 255?
Fabian Blechschmidt
Nie. nazwa bazy danych to coś innego.
Sukeshini

Odpowiedzi:

44

sales_flat_orderto pełna nazwa tablei dlatego musisz używać aliasu w$installer->getTable()

W $installer->getTable()parametrze jakmodule_alias/table_alias.

W takim przypadku spróbuj

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

Kiedy to napiszesz, zwróci nazwę tabeli sales_flat_order

dlatego

module_alias = sales

table_alias = order

EDYTOWAĆ

Możesz użyć poniższego skryptu, aby dodać nową kolumnę. Działa dobrze w moim systemie

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

Używam Varien_Db_Ddl_Table::TYPE_TEXTinsted, Varien_Db_Ddl_Table::TYPE_VARCHARponieważ TYPE_VARCHARjest przestarzałe

Możesz sprawdzić @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

Jeśli podasz typ, TYPE_TEXTale ustawisz długość, powiedzmy, że 255Magento utworzy MySQLkolumnę VARCHARtypu.

Keyur Shah
źródło
próbowałem tego, mimo że otrzymuję taką samą odpowiedź
Sukeshini
@Sukeshini sprawdź moją edycję ....
Keyur Shah
Dziękuję Ci bardzo. Działa idealnie i daje +1 za wysiłek włożony w rozwiązanie mojego problemu.
Sukeshini
miło mi słyszeć, że to działa dla Ciebie @Sukeshini
Keyur Shah
@KeyurShah jak dodać nowe pole do niestandardowej tabeli?
Butterfly
5

Nadużywasz metody addColumn:

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

czwartym parametrem jest nazwa schematu, w twoim wywołaniu czwartym parametrem jest 255.

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

Jeśli użyjesz odpowiednich parametrów, powinno to działać.

Fabian Blechschmidt
źródło
1
TYPE_VARCHAR jest przestarzałe, więc musimy użyć TYPE_TEXT zgodnie z Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes. ,, popraw mnie, jeśli się mylę. @Fabian
Keyur Shah
Masz rację. TYPE_TEXT o długości <255 automatycznie maksymalizuje varchar.
Fabian Blechschmidt
@Fabian Blechschmidt: Dziękujemy za wskazanie brakujących miejsc. i +1
Sukeshini
4

Zdaję sobie sprawę, że jest to stosunkowo „stare” pytanie, ale ponieważ Google wciąż dość łatwo je znaleźć, postanowiłem dodać tę odrobinę informacji.

Jeśli chodzi o twoje pytanie, jeśli chcesz zmienić tabelę sprzedaży / zamówienia, nie powinno tego robić tradycyjne skrypty instalacyjne / konfiguracja. Mage_CatalogModuł wykorzystuje inną Resource_Setupklasę, a mianowicie Mage_Sales_Model_Resource_Setup.

Jeśli chcesz dodać atrybuty do modelu sprzedaży / zamówienia, aby upewnić się, że wszystko zostało poprawnie dodane i przetworzone, dodaj swój atrybut w następujący sposób:

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

Jeśli zastanawiasz się, dlaczego , to odpowiedź należy do addAttribute()funkcji Mage_Sales_Model_Resource_Setupklasy:

/**
 * 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
źródło
Good Catch .. Nigdy nie wiem, czy możemy użyć addAttributemodułu Sales_Order
Rajeev K Tomy
To właściwie najbardziej poprawna odpowiedź.
fantastyczny
Korzystałem z $thisinstalatora, twoja odpowiedź wskazała mi właściwy kierunek. Dziękuję bardzo!
Dr Gianluigi Zane Zanettini