Bagaimana cara menambahkan kolom baru ke tabel yang ada di Magento secara terprogram?

23

Bagaimana saya bisa menambahkan kolom baru ke tabel inti Magento yang ada melalui skrip instal? (tanpa menggunakan SQL murni)

Saya ingin menggunakan cara Magento yang menggunakan metode alias untuk membuat skrip instalasi.

Sejauh ini saya mengikuti beberapa tutorial. Namun sepertinya tidak berfungsi dengan baik. StackOverflow ini ALTER TABLE di skrip pengaturan Magento tanpa menggunakan jawaban SQL agak mirip dengan pertanyaan saya. Tapi apa konten yang harus dimasukkan ke confg.xmlfile modul ? Apakah saya hanya perlu mendefinisikan model sumber daya, model dan pengaturan data sudah cukup?

Bagian yang relevan dari config.xml(modul saya) adalah sebagai berikut.

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

Dan skrip instal saya adalah sebagai berikut.

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

Tapi saya mendapatkan kesalahan berikut.

SQLSTATE [42S02]: Tabel dasar atau tampilan tidak ditemukan: 1146 Tabel '255.sales_flat_order' tidak ada

Setiap saran untuk memperbaikinya akan sangat dihargai.

Sukeshini
sumber
Apakah databasename 255?
Fabian Blechschmidt
tidak. nama basis data adalah sesuatu yang lain.
Sukeshini

Jawaban:

44

sales_flat_orderadalah nama lengkap dari tabledan karenanya Anda harus menggunakan alias dalam$installer->getTable()

Pada $installer->getTable()parameter likemodule_alias/table_alias.

Dalam hal ini coba dengan

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

Saat Anda menulis ini, ia akan mengembalikan nama tabel sales_flat_order

karena

module_alias = sales

table_alias = order

EDIT

Anda dapat menggunakan skrip di bawah ini untuk menambahkan kolom baru. Ini berfungsi dengan baik di sistem saya

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

Saya menggunakan Varien_Db_Ddl_Table::TYPE_TEXTinsted of Varien_Db_Ddl_Table::TYPE_VARCHARkarena TYPE_VARCHARsudah usang

Anda dapat memeriksa @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

Dan Jika Anda menentukan jenis TYPE_TEXTtetapi mengatur panjang untuk katakanlah 255Magento akan membuat MySQLkolom VARCHARjenis.

Keyur Shah
sumber
mencoba ini, Meskipun saya mendapatkan respons yang sama
Sukeshini
@Sukeshini periksa hasil edit saya ....
Keyur Shah
Terima kasih banyak. Ini berfungsi dengan sempurna dan memberi +1 untuk upaya yang Anda lakukan untuk menyelesaikan masalah saya.
Sukeshini
senang mendengarnya bekerja untuk Anda @Sukeshini
Shah
@KeyurShah cara menambahkan bidang baru ke tabel khusus?
Butterfly
5

Anda menyalahgunakan metode ini addColumn:

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

parameter keempat adalah schemaName, dalam panggilan Anda, parameter keempat adalah 255.

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

Jika Anda menggunakan parameter yang tepat, itu akan berfungsi.

Fabian Blechschmidt
sumber
1
TYPE_VARCHAR sudah tidak digunakan lagi sehingga kami harus menggunakan TYPE_TEXT sesuai Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes. ,, koreksi saya jika saya salah. @Fabian
Shah
Kamu benar. TYPE_TEXT dengan panjang <255 maxes secara otomatis varchar.
Fabian Blechschmidt
@Fabian Blechschmidt: Terima kasih telah menunjukkan tempat yang terlewatkan. dan +1
Sukeshini
4

Saya menyadari ini adalah pertanyaan yang relatif 'lama', tetapi karena masih cukup dapat ditemukan oleh Google, saya memutuskan untuk menambahkan sedikit informasi ini.

Mengenai pertanyaan Anda, jika Anda ingin mengubah tabel penjualan / pesanan, ini tidak boleh dilakukan oleh skrip / pengaturan pemasangan tradisional. The Mage_Catalogmodul menggunakan yang berbeda Resource_Setupkelas, yaitu Mage_Sales_Model_Resource_Setup.

Jika Anda ingin menambahkan atribut ke model penjualan / pesanan, untuk memastikan semuanya ditambahkan dan diproses dengan benar, tambahkan atribut Anda seperti ini:

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

Jika Anda bertanya - tanya mengapa , maka jawabannya ada dalam addAttribute()fungsi Mage_Sales_Model_Resource_Setupkelas:

/**
 * 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
sumber
Good Catch .. Tidak pernah tahu kita bisa menggunakan addAttributemodul Sales_Order
Rajeev K Tomy
Ini sebenarnya jawaban yang paling benar.
fantasticrice
Saya menggunakan $thisinstaller, jawaban Anda mengarahkan saya ke arah yang benar. Terima kasih banyak!
Dr. Gianluigi Zane Zanettini