如何以编程方式向Magento中的现有表添加新列?


23

如何通过安装脚本向现有的Magento核心表添加新列?(不使用纯SQL)

我想使用Magento方法,该方法使用别名方法来创建安装脚本。

到目前为止,我只关注了一些教程。但似乎无法正常工作。Magento安装脚本中的这个StackOverflow ALTER TABLE而不使用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吗?
Fabian Blechschmidt,2015年

没有。数据库名称是其他名称。
Sukeshini 2015年

Answers:


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将创建一个类型MySQLVARCHAR


尝试了这个,即使我得到了相同的答复
Sukeshini 2015年

@Sukeshini检查我的编辑....
Keyur沙阿

非常感谢你。它运作完美,为您解决我的问题而付出了+1的努力。
Sukeshini

很高兴听到它对您有用@Sukeshini
Keyur Shah

@KeyurShah如何在自定义表中添加新字段?
蝴蝶

5

您正在滥用该方法addColumn

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

第四个参数是schemaName,在您的调用中,第四个参数是255

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

如果使用正确的参数,它应该可以工作。


1
TYPE_VARCHAR已弃用,因此我们必须根据Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes使用TYPE_TEXT。如果我输入错误,请更正我。@Fabian
Keyur Shah

你是对的。长度小于255的TYPE_TEXT自动使varchar最大化。
Fabian Blechschmidt,2015年

@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模块
Rajeev K Tomy

这实际上是最正确的答案。
fantasticrice

我正在使用$this安装程序,您的回答将我引向了正确的方向。非常感谢!
Gianluigi Zane Zanettini博士
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.