कई रिश्तों के लिए कई बनाने के लिए Magento 2 में सबसे अच्छा अभ्यास तरीका क्या है?


15

मैंने कोर के चारों ओर देखा है और मॉडलों के बीच कई संबंधों के कई उदाहरणों को देखा है, लेकिन मैं इस पर एक निश्चित उत्तर नहीं देख सकता हूं।

एक उदाहरण के रूप में, मान लें कि हम एक नया मॉडल बनाते हैं और हम मौजूदा उत्पादों की तालिका के साथ कई संबंधों के लिए चाहते हैं।

इसलिए हमारे पास हमारा नया मॉडल - स्टॉकिस्ट है, और हम 2 टेबल बनाते हैं जैसे, एक स्टॉकिस्ट नाम स्टोर करने के लिए, दूसरा उत्पादों के साथ कई संबंधों को स्टोर करने के लिए।

सेटअप कक्षाओं का छोटा संस्करण:

$table = $setup->getConnection()
        ->newTable($installer->getTable('stockist'))
        ->addColumn('stockist_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
            null,
            ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
            'Stockist Id')
        ->addColumn('name',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            null,
            ['nullable' => false],
            'Stockist Name');

 $table = $installer->getConnection()
            ->newTable($installer->getTable('stockist_product'))
            ->addColumn(
                'entity_id',
                \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                null,
                ['identity' => true, 'nullable' => false, 'primary' => true],
                'Entity ID'
            )
            ->addColumn(
                'stockist_id',
                \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                null,
                ['unsigned' => true, 'nullable' => false, 'primary' => true, 'default' => '0'],
                'Stockist ID'
            )
            ->addColumn(
                'product_id',
                \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                null,
                ['unsigned' => true, 'nullable' => false, 'primary' => true, 'default' => '0'],
                'Product ID'
            )
            ->addIndex(
                $installer->getIdxName('stockist_product', ['product_id']),
                ['product_id']
            )
            ->addIndex(
                $installer->getIdxName(
                    'stockist_product,
                    ['stockist_id', 'product_id'],
                    \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
                ),
                ['stockist_id', 'product_id'],
                ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
            )
            ->addForeignKey(
                $installer->getFkName('stockist_product', 'product_id', 'catalog_product_entity', 'entity_id'),
                'product_id',
                $installer->getTable('catalog_product_entity'),
                'entity_id',
                \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
            )
            ->addForeignKey(
                $installer->getFkName('stockist_product', 'stockist_id', 'stockist', 'stockist_id'),
                'stockist_id',
                $installer->getTable('stockist'),
                'stockist_id',
                \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
            )
            ->setComment('Stockist to Product Many to Many');

फिर हम स्टॉकिस्ट के लिए एक मानक मॉडल / ResourceModel / Collection बनाते हैं:

namespace OurModule\Stockist\Model;

use Magento\Framework\Model\AbstractModel;

class Stockist extends AbstractModel
{

    protected function _construct()
    {
        $this->_init('OurModule\Stockist\Model\ResourceModel\Stockist');
    }

}

namespace OurModule\Stockist\Model\ResourceModel;

use Magento\Framework\Model\ResourceModel\Db\AbstractDb;

class Stockist extends AbstractDb
{

    protected function _construct()
    {
        $this->_init('stockist', 'stockist_id');
    }

}

namespace OurModule\Stockist\Model\ResourceModel\Stockist;

use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection
{

    public function _construct()
    {
        $this->_init('OurModule\Stockist\Model\Stockist', 'OurModule\Stockist\Model\ResourceModel\Stockist');
    }

}

यह वह जगह है जहां हम कई संबंधों के साथ तालिका को कैसे संभालते हैं। अब तक मैं इस की तर्ज पर कुछ लेकर आया हूं।

StockistProduct का प्रतिनिधित्व करने के लिए एक मॉडल बनाएं

namespace OurModule\Stockist\Model;

use Magento\Framework\Model\AbstractModel;

class StockistProduct extends AbstractModel
{

protected function _construct()
{
    $this->_init('OurModule\Stockist\Model\ResourceModel\StockistProduct');
}

/**
 * @param array $productIds
 */
public function getStockists($productIds)
{
    return $this->_getResource()->getStockists($productIds);
}

/**
 * @param array $stockistIds
 */
public function getProducts($stockistIds)
{
    return $this->_getResource()->getProducts($stockistIds);
}
}

यहाँ 2 विधियाँ परिभाषित की गई हैं, जो या तो स्टाकिस्ट Ids की एक सरणी में लगेंगी, जिसमें प्रोडक्ट Ids और उप-वर्जन के मिलान की एक सरणी होगी।

यह Stockist_product तालिका के लिए एक संसाधन मॉडल का उपयोग करता है जिसमें कई संबंध हैं:

/**
 * Class StockistProduct
 */
class StockistProduct extends AbstractDb
{
    /**
     * Model initialization
     *
     * @return void
     */
    protected function _construct()
    {
        $this->_init('stockist_product', 'entity_id');
    }

    /**
     * Retrieve product stockist Ids
     *
     * @param array $productIds
     * @return array
     */
    public function getStockists(array $productIds)
    {
        $select = $this->getConnection()->select()->from(
            $this->getMainTable(),
            ['product_id', 'stockist_id']
        )->where(
            'product_id IN (?)',
            $productIds
        );
        $rowset = $this->getConnection()->fetchAll($select);

        $result = [];
        foreach ($rowset as $row) {
            $result[$row['product_id']][] = $row['stockist_id'];
        }

        return $result;
    }


    /**
     * Retrieve stockist product Ids
     *
     * @param array $stockistIds
     * @return array
     */
    public function getProducts(array $stockistIds)
    {
        $select = $this->getConnection()->select()->from(
            $this->getMainTable(),
            ['product_id', 'stockist_id']
        )->where(
            'stockist_id IN (?)',
            $stockistIds
        );
        $rowset = $this->getConnection()->fetchAll($select);

        $result = [];
        foreach ($rowset as $row) {
            $result[$row['product_id']][] = $row['stockist_id'];
        }

        return $result;
    }
}

तब इस StockistProduct मॉडल का उपयोग करना जब आपको या तो मॉडल का एक सेट प्राप्त करने की आवश्यकता होती है, तो यह मानकर कि हमारे पास $ उत्पाद में एक उत्पाद मॉडल है, और $ stockistProduct एक उदाहरण है "OurModule \ Stockist \ Model \ Stockistroduct"

$stockists = $stockistProduct->getStockists([$product->getId()]);

तब हम प्रत्येक मॉडल को बदले में लौटा सकते हैं Ids की सूची को लौटाकर ऐसा कर सकते हैं, जहां $ stockistFactory \ OurModule \ Stockist \ Model \ StockistFactory का एक उदाहरण है

$stockist = $this->stockistFactory->create();
$stockist->load($stockistId);

यह सब ठीक काम करता है, और Magento 2 के कोर के भीतर कुछ इसी तरह के कोड पर आधारित है, लेकिन मैं मदद नहीं कर सकता, लेकिन अगर कोई बेहतर तरीका है?


मुझे बहुत कुछ ऐसा ही करना है ... और यह एकमात्र विचार है जो मुझे मिला है, अगर कोई जवाब नहीं है :(
slayerbleast

जवाबों:


1

मैंने इसके समान एक समाधान लागू किया। प्रत्येक एसकेयू के लिए, "फिटमेंट" जानकारी थी: एक कार, मॉडल, जिस पर उत्पाद (कार एक्सेसरी) लागू किया जा सके, का मॉडल। इसके चेहरे पर, यह देशी मैगनेटो विशेषताओं के साथ सबसे आसान होगा। बस तीन टेक्स्ट फ़ील्ड का उपयोग करें, एक वर्ष के लिए, एक मेक के लिए, एक मॉडल के लिए। यह सभी अंतर्निहित मैगनेटो कार्यक्षमता की अनुमति देता है, जैसे कि इन विशेषताओं को खोजना और फ़िल्टर करना, साथ ही भविष्य में आसानी से अपडेट करना।

जैसा कि आप वर्णन करते हैं, समस्या यह है कि हमें इन रिश्तों की "बहुत" जरूरत है। हम 30 पाठ विशेषताएँ बना सकते हैं: वर्ष 1, मेक 1, मॉडल 1, वर्ष 2, मेक 2, मॉडल 2, ... वर्ष 10, मेक 10, मॉडल 10। यह क) संभावना कई खाली विशेषताओं को छोड़ देगा, और ख) उन कारों की संख्या पर एक कृत्रिम सीमा बनाता है जो एक उत्पाद का समर्थन करता है।

काम कुछ इस तरह से हो सकता है:

Year: ____
Make: ____
Model: ____

Add new YearMakeModel relationship (+)

और फिर प्लस (+) पर क्लिक करने के बाद आप देखेंगे:

Year: ____
Make: ____
Model: ____

Year: ____
Make: ____
Model: ____

Add new YearMakeModel relationship (+)

इस तरह के UI को एक समर्थित थीम टेम्पलेट के अंदर जावास्क्रिप्ट के साथ लागू किया जा सकता है। फॉर्म सबमिट करने पर, आपको यह डेटा उत्पाद विशेषताओं के रूप में Magento को प्रदान करना होगा। मुझे नहीं लगता कि वर्तमान में एक विशेषता प्रकार है जो एक गतिशील लंबाई का समर्थन करता है। आप एक कस्टम विशेषता प्रकार लागू कर रहे होंगे। फिर, यह अंतर्निहित मैगनेटो कार्यक्षमता से समर्थन प्रदान करता है: भविष्य में इन विशेषताओं के लिए दर्ज की गई विशेषताओं, आसान अपडेट पर खोज करना।

अंत में, हमारे क्लाइंट ने इस "आसान संपादन" को लागू न करके पैसे बचाने का निर्णय लिया, और इसके बजाय हमने एक कस्टम टेबल में डेटा को बंद कर दिया, जैसा कि आप वर्णन करते हैं। मेरे पास एक कस्टम आयात स्क्रिप्ट है जो CSV इनपुट और आउटपुट को तालिका में ले जाती है। बाद में, उत्पाद पृष्ठ (अच्छी तरह से, इसका ब्लॉक) इस तालिका पर प्रश्न बनाता है, इसके SKU के बारे में जानकारी निकालता है, और तालिका के रूप में उपयोगकर्ता को प्रदर्शित करता है। यह उत्पाद पृष्ठ तालिका ग्राहक से वांछित व्यवहार था, इसलिए हमारे लिए इसे "द मैगेंटो वे" करने और एक चर-सदस्य विशेषता को लागू करने में खुदाई करने का कोई मतलब नहीं था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.