프로그래밍 방식으로 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입니까?
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_TEXT의 insted Varien_Db_Ddl_Table::TYPE_VARCHAR때문에 TYPE_VARCHAR사용되지 않습니다

당신은 확인할 수 있습니다 @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

그리고 type을 지정 TYPE_TEXT하지만 length를 설정하면 255Magento가 type 의 MySQL열을 만들 수 있습니다 VARCHAR.


같은 반응을
얻었음

내 편집 .... 확인 @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

@ 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;
}

좋은 캐치 .. 우리가 사용할 수 있습니다 모를 addAttributeSALES_ORDER 모듈
라지브 K 다카라 토미

이것은 실제로 가장 정답입니다.
fantasticrice

나는 $this설치 프로그램 을 사용하고 있었고 , 당신의 대답은 올바른 방향을 가리 켰습니다. 정말 고맙습니다!
Dr. Gianluigi Zane Zanettini
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.