จะเพิ่มคอลัมน์ใหม่ลงในตารางที่มีอยู่ใน Magento โดยทางโปรแกรมได้อย่างไร


23

ฉันจะเพิ่มคอลัมน์ใหม่ไปยังตารางหลักของวีโอไอพีที่มีอยู่ผ่านสคริปต์การติดตั้งได้อย่างไร (โดยไม่ใช้ pure SQL)

ฉันต้องการใช้วิธีวีโอไอพีซึ่งใช้วิธีนามแฝงเพื่อสร้างสคริปต์การติดตั้ง

จนถึงตอนนี้ฉันได้ติดตามบทเรียนไม่กี่ครั้ง แต่ดูเหมือนว่าจะทำงานไม่ถูกต้อง StackOverflow นี้เปลี่ยนแปลงในสคริปต์การตั้งค่าวีโอไอพีโดยไม่ใช้คำตอบ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

ไม่ ชื่อฐานข้อมูลเป็นอย่างอื่น
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แต่กำหนดความยาวเพื่อให้บอกว่า255วีโอไอพีจะสร้างMySQLคอลัมน์VARCHARประเภท


ลองสิ่งนี้แม้ว่าฉันจะได้รับการตอบกลับเหมือนกัน
ก็ตาม

@Sukeshini ตรวจสอบการแก้ไขของฉัน ....
Keyur Shah

ขอบคุณมาก. มันทำงานได้อย่างสมบูรณ์และ +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 ถูกคัดค้านดังนั้นเราจึงต้องใช้ TYPE_TEXT ตาม Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes ให้แก้ไขถ้าฉันผิด @Fabian
Keyur Shah

คุณพูดถูก TYPE_TEXT ที่มีความยาว <255 maxes varchar โดยอัตโนมัติ
Fabian Blechschmidt

@Fabian Blechschmidt: ขอบคุณที่ชี้ให้เห็นสถานที่ที่ไม่ได้รับ และ +1
Sukeshini

4

ฉันรู้ว่านี่เป็นคำถามที่ค่อนข้าง 'เก่า' แต่เนื่องจาก Google ยังหาได้ค่อนข้างฉันจึงตัดสินใจที่จะเพิ่มข้อมูลนี้

เกี่ยวกับคำถามของคุณหากคุณต้องการเปลี่ยนตารางการขาย / การสั่งซื้อสิ่งนี้ไม่ควรกระทำโดยการติดตั้งสคริปต์ / การตั้งค่าแบบดั้งเดิม Mage_Catalogโมดูลใช้ที่แตกต่างกันระดับคือResource_SetupMage_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
Rajeev K Tomy

นี่เป็นคำตอบที่ถูกต้องที่สุด
fantasticrice

ฉันใช้ตัว$thisติดตั้งคำตอบของคุณชี้ให้ฉันไปในทิศทางที่ถูกต้อง ขอบคุณมาก!
ดร. Gianluigi Zane Zanettini
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.