मैग्नेटो में मौजूदा तालिका में नए कॉलम को प्रोग्रामेटिक रूप से कैसे जोड़ें?


23

मैं स्थापित स्क्रिप्ट के माध्यम से मौजूदा Magento कोर तालिका में एक नया कॉलम कैसे जोड़ सकता हूं? (शुद्ध एसक्यूएल का उपयोग किए बिना)

मैं Magento तरीके का उपयोग करना चाहता हूं जो कि स्क्रिप्ट स्थापित करने के लिए अन्य तरीकों का उपयोग कर रहा है।

अब तक मैंने कुछ ट्यूटोरियल का अनुसरण किया है। लेकिन लगता है कि ठीक से काम नहीं कर रहा है। SQL उत्तर का उपयोग किए बिना Magento सेटअप स्क्रिप्ट में यह StackOverflow ALTER टेबल कुछ हद तक मेरे प्रश्न के समान था। लेकिन क्या सामग्री को मॉड्यूल की 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_s' मौजूद है

इसे ठीक करने के किसी भी सुझाव की सराहना की जाएगी।


डेटाबेसन है 255?
फैबियन ब्लेसश्मिड

नहीं। डेटाबेस का नाम कुछ और है।
सुकेशिनी

जवाबों:


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_TEXTलेकिन यह कहने के लिए लंबाई निर्धारित करते हैं कि 255Magento प्रकार MySQLका एक कॉलम बनाएगा VARCHAR


यह कोशिश की, भले ही मुझे एक ही प्रतिक्रिया मिल रही है
सुकेशिनी

@ सुकेशिनी मेरे संपादन की जाँच करें ....
शाह

आपका बहुत बहुत धन्यवाद। मेरी समस्या को हल करने के लिए आपके द्वारा किए गए प्रयास के लिए इसने पूरी तरह से और +1 काम किया।
सुकेशिनी

यह सुनकर खुशी हुई कि यह आपके लिए काम करता है @ सुकेशिनी
शाह

@KeyurShah कस्टम तालिका में एक नया फ़ील्ड कैसे जोड़ें?
तितली

5

आप विधि का दुरुपयोग कर रहे हैं addColumn:

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

चौथा पैरामीटर स्कीमा नाम है, आपके कॉल में, चौथा पैरामीटर है 255

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

यदि आप सही मापदंडों का उपयोग करते हैं, तो यह काम करना चाहिए।


1
TYPE_VARCHAR को पदावनत किया जाता है, इसलिए हमें VPEen_Db_Adapter_Pdo_Mysql :: $ _ ddlColumnTypes। के अनुसार TYPE_TEXT का उपयोग करना होगा।, मुझे सही करें कि मैं गलत हूं। @Fabian
शाह

तुम सही हो। लंबाई के साथ TYPE_TEXT <255 अधिकतम स्वचालित रूप से एक varchar है।
फैबियन ब्लेसस्मिड

@ फैबियन ब्लेसश्मिड: याद किए गए स्थानों को इंगित करने के लिए धन्यवाद। और +1
सुकेशिनी

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 मॉड्यूल के लिए उपयोग कर सकते हैं
Rajeev K Tomy

यह वास्तव में सबसे सही उत्तर है।
शानदार

मैं $thisइंस्टॉलर का उपयोग कर रहा था , आपके उत्तर ने मुझे सही दिशा की ओर इशारा किया। आपको बहुत - बहुत धन्यवाद!
डॉ। जियानलुइगी ज़ेन ज़नेटिनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.