プログラムでMagentoの既存のテーブルに新しい列を追加する方法は?


23

インストールスクリプトを使用して既存のMagentoコアテーブルに新しい列を追加するにはどうすればよいですか?(純粋なSQLを使用せずに)

エイリアスメソッドを使用してインストールスクリプトを作成するMagentoの方法を使用したいと思います。

これまでのところ、いくつかのチュートリアルに従いました。しかし、正常に動作していないようです。SQL回答を使用しないMagentoセットアップスクリプトのこのStackOverflow ALTER TABLEは、私の質問と多少似ていました。しかし、モジュールの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

編集

以下のスクリプトを使用して、新しい列を追加できます。私のシステムではうまくいきます

$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_TEXTのinsted Varien_Db_Ddl_Table::TYPE_VARCHARのでTYPE_VARCHAR廃止されました

確認してもいい @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

タイプを指定しTYPE_TEXT、長さを設定し255て、MagentoがタイプのMySQL列を作成するように設定した場合VARCHAR


これを試してみたが、同じ反応が得られたにもかかわらず
スケシニ

私の編集....チェック@Sukeshini
Keyurシャー

どうもありがとうございました。それは完璧に機能し、私の問題を解決するためにあなたがした努力に対して+1されました。
スケシニ

それがあなたのために働くことを聞いてうれしいです@Sukeshini
Keyur Shah

@KeyurShahカスタムテーブルに新しいフィールドを追加する方法
バタフライ

5

メソッドを誤用していますaddColumn

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

4番目のパラメーターはschemaNameで、呼び出しの4番目のパラメーターは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シャー

あなたが正しいです。長さが255未満のTYPE_TEXTは、varcharを自動的に最大化します。
ファビアンブレシュミット

@Fabian Blechschmidt:逃した場所を指摘してくれてありがとう。および+1
スケシニ

4

これは比較的「古い」質問であることに気づきましたが、Googleでまだかなり見つけやすいので、この情報を追加することにしました。

質問に関して、sales / orderテーブルを変更したい場合、これは従来のインストールスクリプト/セットアップでは行わないでください。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;
}

グッドキャッチ.. addAttributeSales_Orderモジュールに使用できることを決して知らない
Rajeev K Tomy

これが実際に最も正しい答えです。
ファンタスティックライス

私は$thisインストーラーを使用していましたが、あなたの答えは正しい方向を示してくれました。どうもありがとうございます!
ジャンルイジ・ザネ・ザネッティニ博士
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.