Magento'daki mevcut tabloya programsal olarak nasıl yeni sütun eklenir?


23

Install komut dosyasıyla mevcut Magento çekirdek tablosuna yeni bir sütunu nasıl ekleyebilirim? (saf SQL kullanmadan)

Install scriptini oluşturmak için alias yöntemlerini kullanan Magento yolunu kullanmak istiyorum.

Şimdiye kadar birkaç ders izledim. Ancak düzgün çalışmıyor gibi görünüyor. Magento kurulum betiğindeki SQL Stack kullanmadan bu StackOverflow ALTER TABLE, soruma biraz benziyordu. Ancak, modül modülünün içeriğine ne konulmalı confg.xml? Sadece kaynak modelini tanımlamam gerekiyor mu, model ve kurulum verileri yeterli mi?

config.xml(Modülümün) ilgili kısmı aşağıdaki gibidir.

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

Ve benim kurulum betiğim aşağıdaki gibidir.

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

Ama aşağıdaki hatayı alıyorum.

SQLSTATE [42S02]: Temel tablo veya görünüm bulunamadı: 1146 Tablo '255.sales_flat_order' mevcut değil

Bunu düzeltmek için herhangi bir öneri takdir edilecektir.


Veritabanının adı 255mı?
Fabian Blechschmidt

yok hayır. veritabanı adı başka bir şeydir.
Sukeshini

Yanıtlar:


44

sales_flat_ordertam adıdır tableve bu nedenle takma ad kullanmak zorundasınız.$installer->getTable()

Gelen $installer->getTable()gibi parametremodule_alias/table_alias.

Bu durumda dene

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

Bunu yazdığınızda tablo ismini döndürür sales_flat_order

Çünkü

module_alias = sales

table_alias = order

DÜZENLE

Yeni sütun eklemek için aşağıdaki betiği kullanabilirsiniz. Benim sistemimde iyi çalışıyor

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

Ben Varien_Db_Ddl_Table::TYPE_TEXTinsted kullanıyorum Varien_Db_Ddl_Table::TYPE_VARCHARçünkü TYPE_VARCHARkullanımdan kaldırıldı

Kontrol edebilirsin @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

Ve türünü belirtirseniz TYPE_TEXTancak uzunluğu belirlemeye izin verirseniz, 255Magento türünde bir MySQLsütun oluşturur VARCHAR.


Bunu denedim, aynı yanıtı alıyorum olsa bile
Sukeshini

@Sukeshini düzenlememi kontrol et ....
Keyur Shah

Çok teşekkür ederim. Sorunumu çözmek için gösterdiğiniz çaba için mükemmel bir şekilde ve +1 çalıştı.
Sukeshini,

Bunun sizin için işe yaradığını duyduğuma sevindim @Sukeshini
Keyur Shah

@KeyurShah özel tabloya nasıl yeni bir alan eklenir?
Kelebek

5

Yöntemi kötüye kullanıyorsunuz addColumn:

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

dördüncü parametre şemadır, çağrınızda, dördüncü parametredir 255.

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

Doğru parametreleri kullanırsanız, çalışması gerekir.


1
TYPE_VARCHAR kullanımdan kaldırıldı, bu nedenle TYPE_TEXT'yi Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes. @Fabian
Keyur Şah

Haklısın. <255 uzunluğa sahip TYPE_TEXT otomatik olarak bir varchar maks.
Fabian Blechschmidt

@Fabian Blechschmidt: Kaçırılan yerleri işaret ettiğiniz için teşekkür ederiz. ve +1
Sukeshini

4

Bunun nispeten 'eski' bir soru olduğunu fark ettim, ancak Google tarafından hala oldukça iyi anlaşılabilir olduğu için, bu bilgiyi biraz eklemeye karar verdim.

Sorunuzla ilgili olarak, satış / sipariş tablosunu değiştirmek istiyorsanız, geleneksel kurulum komut dosyaları / ayarları tarafından yapılmamalıdır. Mage_CatalogModülü farklı kullanır Resource_Setup, yani sınıfı Mage_Sales_Model_Resource_Setup.

Satış / sipariş modeline nitelik eklemek istiyorsanız, her şeyin doğru eklendiğinden ve işlendiğinden emin olmak için özniteliğinizi şöyle ekleyin:

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

Nedenini merak ediyorsanız , cevap sınıfın addAttribute()fonksiyonu dahilindedir 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 .. addAttributeSales_Order modülü için kullanabileceğimizi asla bilemeyiz
Rajeev K Tomy

Bu aslında en doğru cevap.
fantastik

$thisYükleyici kullanıyordum , cevabınız beni doğru yöne gösterdi. Çok teşekkür ederim!
Dr. Gianluigi Zane Zanettini
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.