Як додати новий стовпець до наявної таблиці в Magento програмно?


23

Як я можу додати новий стовпець до наявної основної таблиці Magento за допомогою скрипта установки? (без використання чистого SQL)

Я хочу використовувати спосіб Magento, який використовує методи псевдонімів для створення скрипта встановлення.

Поки я дотримувався кількох навчальних посібників. Але, здається, не працює належним чином. Цей StackOverflow ALTER TABLE в сценарії налаштування Magento без використання відповіді SQL був дещо схожим на моє запитання. Але який вміст слід помістити у confg.xmlфайл модуля ? Чи потрібно мені просто визначити модель ресурсу, даних про модель та налаштування?

Відповідна частина config.xml(мого модуля) така.

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

І мій сценарій встановлення такий.

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

Але я отримую таку помилку.

SQLSTATE [42S02]: Базова таблиця або представлення не знайдено: 1146 Таблиця "255.sales_flat_order" не існує

Будь-яка пропозиція виправити це буде вдячна.


Чи ім'я бази даних 255?
Фабіан Блешшмідт

ні. назва бази даних - це щось інше.
Сукешині

Відповіді:


44

sales_flat_orderє повним ім'ям tableі тому ви повинні використовувати псевдонім у$installer->getTable()

У $installer->getTable()такому параметріmodule_alias/table_alias.

У такому випадку спробуйте

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

Коли ви напишете це, він поверне ім'я таблиці sales_flat_order

тому що

module_alias = sales

table_alias = order

EDIT

Ви можете використовувати нижче сценарій, щоб додати новий стовпець. Він прекрасно працює в моїй системі

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

Я використовую Varien_Db_Ddl_Table::TYPE_TEXTinsted з, Varien_Db_Ddl_Table::TYPE_VARCHARтому що TYPE_VARCHARце застаріле

Ви можете перевірити @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

І якщо ви вкажете тип, TYPE_TEXTале встановите довжину, скажімо, що 255Magento створить MySQLколонку VARCHARтипу.


спробував це, Хоча я отримую таку ж відповідь
Сукешині

@Sukeshini перевірити мою редагування ....
Кейур Шах

Велике спасибі. Це спрацювало чудово та +1 за зусилля, які ви доклали, щоб вирішити мою проблему.
Сукешині

рада почути, що це працює для вас @Sukeshini
Keyur Shah

@KeyurShah як додати нове поле до спеціальної таблиці?
Метелик

5

Ви неправильно використовуєте метод addColumn:

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

четвертий параметр - це схемаName, у вашому дзвінку четвертий параметр - 255.

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

Якщо ви використовуєте правильні параметри, це повинно працювати.


1
TYPE_VARCHAR застарілий, тому ми повинні використовувати TYPE_TEXT відповідно до Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes., Виправте мене, якщо я помиляюся. @Fabian
Keyur Shah

Ти правий. TYPE_TEXT з довжиною <255 максимум автоматично варчар.
Фабіан Блешшмідт

@Fabian Blechschmidt: Дякую за вказівку на пропущені місця. та +1
Сукешині

4

Я усвідомлюю, що це відносно «старе» питання, але оскільки Google все ще є досить значущим, я вирішив додати цю інформацію.

Що стосується вашого питання, якщо ви хочете змінити таблицю продажів / замовлень, це не повинно робитись традиційними сценаріями встановлення / налаштування. Mage_CatalogМодуль використовує інший Resource_Setupклас, а саме Mage_Sales_Model_Resource_Setup.

Якщо ви хочете додати атрибути до моделі продажу / замовлення, щоб переконатися, що все додано та оброблено правильно, додайте свій атрибут так:

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

Якщо вам цікаво чому , тоді відповідь знаходиться у addAttribute()функції Mage_Sales_Model_Resource_Setupкласу:

/**
 * 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;
}

Good Catch .. Ніколи не знаю, що ми можемо використовувати addAttributeдля модуля Sales_Order
K Tomy

Це насправді найбільш правильна відповідь.
фантастичнагриза

Я використовував $thisінсталятор, ваша відповідь вказувала мене в правильному напрямку. Дуже дякую!
Доктор Джанлуїджі Зене Занеттіні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.