Wie füge ich programmatisch eine neue Spalte zu einer vorhandenen Tabelle in Magento hinzu?

23

Wie kann ich eine neue Spalte über ein Installationsskript zu einer vorhandenen Magento-Kerntabelle hinzufügen? (ohne Verwendung von reinem SQL)

Ich möchte die Magento-Methode verwenden, die Alias-Methoden verwendet, um ein Installationsskript zu erstellen.

Bisher habe ich nur wenige Tutorials besucht. Scheint aber nicht richtig zu funktionieren. Dieses StackOverflow ALTER TABLE im Magento-Setup-Skript ohne SQL- Antwort war meiner Frage etwas ähnlich. Aber was soll der Inhalt in die confg.xmlDatei des Moduls geschrieben werden? Muss ich nur ein Ressourcenmodell definieren, wären Modell- und Konfigurationsdaten ausreichend?

Der relevante Teil von config.xml(meines Moduls) ist wie folgt.

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

Und mein Installationsskript ist wie folgt.

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

Aber ich erhalte den folgenden Fehler.

SQLSTATE [42S02]: Basistabelle oder Sicht nicht gefunden: 1146 Tabelle '255.sales_flat_order' existiert nicht

Jeder Vorschlag, dies zu beheben, wäre willkommen.

Sukeshini
quelle
Ist der Datenbankname 255?
Fabian Blechschmidt
Nein. Datenbankname ist etwas anderes.
Sukeshini

Antworten:

44

sales_flat_orderist der vollständige Name von tableund daher muss in alias verwendet werden$installer->getTable()

In $installer->getTable()Parameter wiemodule_alias/table_alias.

In diesem Fall versuchen Sie es mit

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

Wenn Sie dies schreiben, wird der Tabellenname zurückgegeben sales_flat_order

da

module_alias = sales

table_alias = order

BEARBEITEN

Sie können das folgende Skript verwenden, um eine neue Spalte hinzuzufügen. Es funktioniert gut in meinem System

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

Ich benutze Varien_Db_Ddl_Table::TYPE_TEXTInsted von Varien_Db_Ddl_Table::TYPE_VARCHARweil TYPE_VARCHARes veraltet ist

Du kannst nachschauen @ Varien_Db_Adapter_Pdo_Mysql::$_ddlColumnTypes

Und wenn Sie den Typ angeben, TYPE_TEXTaber die Länge so festlegen , dass 255Magento eine MySQLSpalte mit dem VARCHARTyp erstellt.

Keyur Shah
quelle
Ich habe es versucht, obwohl ich die gleiche Antwort
bekomme
@Sukeshini check my edit ....
Keyur Shah
Vielen Dank. Es hat perfekt funktioniert und +1 für die Mühe, die Sie gemacht haben, um mein Problem zu lösen.
Sukeshini
froh zu hören, dass es für Sie funktioniert @Sukeshini
Keyur Shah
@KeyurShah Wie füge ich ein neues Feld in eine benutzerdefinierte Tabelle ein?
Schmetterling
5

Sie missbrauchen die Methode addColumn:

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

Der vierte Parameter ist der schemaName. In Ihrem Aufruf ist der vierte Parameter 255.

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

Wenn Sie die richtigen Parameter verwenden, sollte es funktionieren.

Fabian Blechschmidt
quelle
1
TYPE_VARCHAR ist veraltet, daher müssen wir TYPE_TEXT gemäß Varien_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes verwenden. ,, Korrigieren Sie mich, wenn ich falsch liege. @ Fabian
Keyur Shah
Du hast recht. TYPE_TEXT mit einer Länge <255 maxiert automatisch ein Varchar.
Fabian Blechschmidt
@Fabian Blechschmidt: Danke für den Hinweis auf die verpassten Stellen. und +1
Sukeshini
4

Mir ist klar, dass dies eine relativ "alte" Frage ist, aber da sie von Google immer noch ziemlich auffindbar ist, habe ich beschlossen, diese Informationen hinzuzufügen.

In Bezug auf Ihre Frage, wenn Sie die Verkaufs- / Auftragstabelle ändern möchten, sollte dies nicht mit den herkömmlichen Installationsskripten / -setups erfolgen. Das Mage_CatalogModul verwendet eine andere Resource_SetupKlasse, nämlich Mage_Sales_Model_Resource_Setup.

Wenn Sie dem Verkaufs- / Auftragsmodell Attribute hinzufügen möchten, fügen Sie Ihr Attribut folgendermaßen hinzu, um sicherzustellen, dass alles korrekt hinzugefügt und verarbeitet wird:

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

Wenn Sie sich fragen, warum , dann liegt die Antwort in der addAttribute()Funktion der Mage_Sales_Model_Resource_SetupKlasse:

/**
 * 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;
}
Wesley Vestjens
quelle
Good Catch .. Nie wissen, wir können addAttributefür Sales_Order-Modul verwenden
Rajeev K Tomy
Dies ist eigentlich die richtigste Antwort.
fantasticrice
Ich habe den $thisInstaller verwendet. Ihre Antwort hat mich in die richtige Richtung geleitet. Ich danke dir sehr!
Dr. Gianluigi Zane Zanettini