Làm cách nào để thêm cột mới vào bảng hiện có trong Magento theo lập trình?


23

Làm cách nào tôi có thể thêm một cột mới vào bảng lõi Magento hiện có thông qua tập lệnh cài đặt? (không sử dụng SQL thuần túy)

Tôi muốn sử dụng cách Magento sử dụng các phương thức bí danh để tạo tập lệnh cài đặt.

Cho đến nay tôi đã làm theo vài hướng dẫn. Nhưng dường như không hoạt động đúng. StackOverflow ALTER TABLE này trong tập lệnh thiết lập Magento mà không sử dụng câu trả lời SQL có phần giống với câu hỏi của tôi. Nhưng nội dung nên được đưa vào confg.xmltập tin mô-đun là gì? Tôi có cần chỉ cần xác định mô hình tài nguyên, mô hình và dữ liệu thiết lập là đủ?

Phần có liên quan của config.xml(mô-đun của tôi) như sau.

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

Và kịch bản cài đặt của tôi là như sau.

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

Nhưng tôi đang nhận được lỗi sau.

SQLSTATE [42S02]: Không tìm thấy bảng cơ sở hoặc chế độ xem: 1146 Bảng '255.sales_flat_order' không tồn tại

Bất kỳ đề nghị để khắc phục điều này sẽ được đánh giá cao.


Là tên dữ liệu 255?
Fabian Blechschmidt

Không. tên cơ sở dữ liệu là một cái gì đó khác.
Sukeshini

Câu trả lời:


44

sales_flat_orderlà tên đầy đủ của tablevà vì vậy bạn phải sử dụng bí danh trong$installer->getTable()

Trong $installer->getTable()tham số nhưmodule_alias/table_alias.

Trong trường hợp đó hãy thử với

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

Khi bạn viết nó sẽ trả về tên bảng sales_flat_order

bởi vì

module_alias = sales

table_alias = order

CHỈNH SỬA

Bạn có thể sử dụng tập lệnh bên dưới để thêm cột mới. Nó hoạt động tốt trong hệ thống của tôi

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

Tôi đang sử dụng Varien_Db_Ddl_Table::TYPE_TEXTinsted of Varien_Db_Ddl_Table::TYPE_VARCHARTYPE_VARCHARbị phản đối

Bạn có thể kiểm tra @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

Và nếu bạn chỉ định loại TYPE_TEXTnhưng đặt độ dài để cho biết 255Magento sẽ tạo một MySQLcột VARCHARloại.


đã thử điều này, mặc dù tôi nhận được phản hồi tương tự
Sukeshini

@Sukeshini kiểm tra chỉnh sửa của tôi ....
Keyur Shah

Cảm ơn nhiều. Nó hoạt động hoàn hảo và +1 cho nỗ lực bạn đã thực hiện để giải quyết vấn đề của tôi.
Sukeshini 04/05/2015

rất vui khi biết rằng nó hoạt động cho bạn @Sukeshini
Keyur Shah

@KeyurShah làm thế nào để thêm một trường mới vào bảng tùy chỉnh?
Bướm

5

Bạn đang sử dụng sai phương pháp addColumn:

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

tham số thứ tư là lược đồName, trong cuộc gọi của bạn, tham số thứ tư là 255.

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

Nếu bạn sử dụng đúng tham số, nó sẽ hoạt động.


1
TYPE_VARCHAR không được dùng nữa, vì vậy chúng tôi phải sử dụng TYPE_TEXT theo Varien_Db_Ad Module_Pdo_Mysql :: $ _ ddlColumnTypes. ,, sửa tôi nếu tôi sai. @Fabian
Keyur Shah

Bạn đúng rồi. TYPE_TEXT với độ dài <255 tối đa tự động một varchar.
Fabian Blechschmidt

@Fabian Blechschmidt: Cảm ơn bạn đã chỉ ra những địa điểm bị bỏ lỡ. và +1
Sukeshini

4

Tôi nhận ra đây là một câu hỏi tương đối cũ, nhưng vì Google vẫn có thể tìm thấy khá nhiều, tôi đã quyết định thêm một chút thông tin này.

Về câu hỏi của bạn, nếu bạn muốn thay đổi bảng doanh số / đơn hàng, điều này không nên được thực hiện bởi các tập lệnh / cài đặt truyền thống. Các Mage_Catalogmô-đun sử dụng một Resource_Setuplớp khác nhau , cụ thể là Mage_Sales_Model_Resource_Setup.

Nếu bạn muốn thêm thuộc tính vào mô hình bán hàng / đơn hàng, để đảm bảo mọi thứ được thêm và xử lý chính xác, hãy thêm thuộc tính của bạn như sau:

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

Nếu bạn thắc mắc tại sao , thì câu trả lời nằm trong addAttribute()chức năng của Mage_Sales_Model_Resource_Setuplớp:

/**
 * 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;
}

Bắt tốt .. Không bao giờ biết chúng tôi có thể sử dụng addAttributecho mô-đun Sales_Order
Rajeev K Tomy

Đây thực sự là câu trả lời đúng nhất.
tuyệt vời

Tôi đang sử dụng trình $thiscài đặt, câu trả lời của bạn chỉ cho tôi đi đúng hướng. Cảm ơn bạn rất nhiều!
Tiến sĩ Gianluigi Zane Zanettini
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.