বহু থেকে বহু সম্পর্ক তৈরির জন্য ম্যাজেন্টো 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');

তারপরে আমরা স্টকস্টের জন্য একটি আদর্শ মডেল / রিসোর্সমোডেল / সংগ্রহ তৈরি করি:

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');
    }

}

এখানেই আমরা আসি কীভাবে অনেকের সাথে অনেকের সাথে টেবিলটি পরিচালনা করব। এখন পর্যন্ত আমি এর লাইন বরাবর কিছু নিয়ে এসেছি।

স্টকবাদী পণ্যকে উপস্থাপনের জন্য একটি মডেল তৈরি করুন

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 টি পদ্ধতির সংজ্ঞা দেওয়া হচ্ছে যা স্টকবাদী আইডির একটি অ্যারে নেবে, পণ্যের আইডির সাথে এবং তদ্বিপরীত মিলের অ্যারে ফিরে আসবে।

এটি স্টকস্ট_প্রডাক্ট টেবিলের জন্য একাধিক থেকে অনেকের মধ্যে রিসোর্স মডেল ব্যবহার করে:

/**
 * 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;
    }
}

তারপরে এই স্টকলিস্টপ্রডাক্ট মডেলটি ব্যবহার করার সময় যখন আপনার উভয় মডেলের একটি সেট পুনরুদ্ধার করা দরকার তখন ধরে নেওয়া, আমাদের we পণ্যতে একটি পণ্য মডেল রয়েছে এবং $ স্টকলিস্টপ্রডাক্ট \ আওয়ারমডিউল \ স্টকবাদী \ মডেল \ স্টকবাদী উত্পাদকের উদাহরণ

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

তারপরে আমরা ফিরে আসা আইডির তালিকাটি লুপিং করে প্রতিটি মডেল তৈরি করতে পারি, যেখানে $ স্টকবাদিফ্যাক্টরিটি \ আওয়ারমডিউল \ স্টকবাদী \ মডেল \ স্টকস্টিফ্যাক্টরির উদাহরণ

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

এটি সবই ঠিকঠাক কাজ করে, এবং কোর অফ ম্যাজেন্টো 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 (+)

যেমন একটি ইউআই একটি ব্যাকড থিম টেম্পলেট ভিতরে জাভাস্ক্রিপ্ট সঙ্গে প্রয়োগ করা যেতে পারে। ফর্মটি জমা দেওয়ার পরে, আপনাকে পণ্যের বৈশিষ্ট্য হিসাবে এই ডেটাটি ম্যাজেন্টোতে সরবরাহ করতে হবে। আমি মনে করি না এখানে বর্তমানে একটি গুনযুক্ত দৈর্ঘ্য সমর্থন করে এমন একটি বৈশিষ্ট্য টাইপ রয়েছে। আপনি একটি কাস্টম বৈশিষ্ট্য প্রকার বাস্তবায়ন করা হবে। আবার এটি অন্তর্নির্মিত ম্যাজেন্টো কার্যকারিতা থেকে সহায়তা সরবরাহ করে: প্রবেশ করা বৈশিষ্ট্যগুলিতে অনুসন্ধান করা, ভবিষ্যতে এই বৈশিষ্ট্যের জন্য সহজ আপডেট।

শেষ অবধি, আমাদের ক্লায়েন্ট এই "সহজ সম্পাদনা" প্রয়োগ না করে অর্থ সাশ্রয়ের সিদ্ধান্ত নিয়েছে এবং পরিবর্তে আমরা বর্ণিতভাবেই আমরা কাস্টম টেবিলটিতে ডেটা লক করে রেখেছি। আমার কাছে একটি কাস্টম আমদানি স্ক্রিপ্ট রয়েছে যা সিএসভি ইনপুট নেয় এবং টেবিলের আউটপুট দেয়। পরে, পণ্য পৃষ্ঠা (ভাল, এটির ব্লক) এই টেবিলটিতে প্রশ্ন তৈরি করে, এর এসকিউ সম্পর্কিত তথ্য টানবে এবং ব্যবহারকারীর কাছে টেবিল হিসাবে প্রদর্শন করবে। এই পণ্যের পৃষ্ঠা সারণীটি ক্লায়েন্টের কাছ থেকে পছন্দসই আচরণ ছিল, সুতরাং আমাদের জন্য এটি "দ্য ম্যাগেন্টো ওয়ে" করার এবং একটি পরিবর্তনশীল-সদস্য বৈশিষ্ট্যটি বাস্তবায়নের জন্য বুদ্ধিমান হয়ে উঠেনি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.