설치 스크립트를 통해 기존 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’테이블이 없습니다.
이 문제를 해결하기위한 제안이 있으면 감사하겠습니다.
답변
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를 설정하면 255
Magento가 type 의 MySQL
열을 만들 수 있습니다 VARCHAR
.
답변
방법을 잘못 사용하고 있습니다 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')
올바른 매개 변수를 사용하면 작동합니다.
답변
나는 이것이 상대적으로 ‘오래된’질문임을 알고 있지만 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;
}