Как программно добавить новый столбец в существующую таблицу в 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' не существует

Любое предложение исправить это будет оценено.

Sukeshini
источник
Имя базы данных 255?
Фабиан Блехшмидт
нет. Имя базы данных это нечто другое.
Sukeshini

Ответы:

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

РЕДАКТИРОВАТЬ

Вы можете использовать скрипт ниже, чтобы добавить новый столбец. Он отлично работает в моей системе

$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
@Sukeshini проверь мое редактирование ....
Кейур Шах
Большое спасибо. Это сработало отлично и +1 за усилия, которые вы приложили, чтобы решить мою проблему.
Sukeshini
рад слышать, что это работает для вас @Sukeshini
Keyur Shah
@KeyurShah как добавить новое поле в пользовательскую таблицу?
Бабочка
5

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

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

четвертый параметр - имя схемы, в вашем вызове четвертый параметр - 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
Кейур Шах
Вы правы. TYPE_TEXT длиной <255 автоматически максирует varchar.
Фабиан Блехшмидт
@Fabian Blechschmidt: Спасибо за указание пропущенных мест. и +1
Sukeshini
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;
}
Уэсли Вестженс
источник
Хороший улов .. Никогда не знаешь, что мы можем использовать addAttributeдля модуля Sales_Order
Раджив К Томи
На самом деле это самый правильный ответ.
fantasticrice
Я использовал $thisустановщик, ваш ответ указал мне правильное направление. Спасибо большое!
Доктор Джанлуиджи Зане Занеттини