ম্যাজেন্টো - কাস্টম (নন ইভা) মডেল, একাধিক ক্ষেত্র দ্বারা লোড


15

আমার একটি কাস্টম মডেল এবং সংস্থান মডেল রয়েছে। আমি একাধিক ক্ষেত্র ব্যবহার করে মডেলের একক উদাহরণ লোড করতে চাই।

মডেলের নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:

id
tag_name
custom_name
group_name

আমি আইডির পরিবর্তে ট্যাগ_নাম, কাস্টম_নাম এবং গ্রুপ_নামের ভিত্তিতে এই মডেলটি লোড করতে চাই।

বর্তমানে আমি প্রতিটি ক্ষেত্রের জন্য সংগ্রহ এবং অ্যাড ফিল্টার ব্যবহার করছি। এটি কাজ করে, তবে আমি ভাবলাম যে ম্যাজেন্টোতে এই ধরণের জিনিসটির জন্য কোনও স্ট্যান্ডার্ড কৌশল আছে?

সম্পাদনা

কোর ম্যাজেন্টো এই দৃশ্যের জন্য সংগ্রহগুলি ব্যবহার করবে না বলে মনে হচ্ছে তবে পরিবর্তে এটি উত্স মডেলগুলিতে সরাসরি স্কএল কোয়েরি ব্যবহার করে।

এর উদাহরণ হ'ল:

loadByAccountAndDate() ভিতরে Mage_Paypal_Model_Resource_Report_Settlement

কোডের পরিমাণের ক্ষেত্রে, সংগ্রহগুলি আরও সংক্ষিপ্ততর বলে মনে হয়, এর কোনও কারণ আছে কি?

আমি কেবল জানি না কেন ম্যাজেন্টো এইভাবে এটি বেছে নেয়

উত্তর:


22

আমি মনে করি এটি একটি ভাল পদ্ধতির। হয়ত আপনাকে মডেল ক্লাসে একটি র‌্যাপার তৈরি করতে হবে যাতে আপনি একই জিনিস বারবার লেখা এড়াতে পারবেন।
কিছুটা এইরকম:

public function loadByMultiple($tag, $customName, $group){
    $collection = $this->getCollection()
            ->addFieldToFilter('tag_name', $tag)
            ->addFieldToFilter('custom_name', $customName)
            ->addFieldToFilter('group_name', $group);
    return $collection->getFirstItem();
}

এবং আপনি এই আইটেমটি অন্য কোনও জায়গায় লোড করতে পারেন:

$model = Mage::getModel('model/class_here')->loadByMultiple($tag, $customName, $group);
if ($model->getId()){
   //the instance exists
}
else{
    //not found
}

সংগ্রহগুলি ব্যবহার করার বিষয়ে আমি আমার উদ্বেগ নিয়ে আমার প্রশ্ন আপডেট করেছি
মার্টি ওয়ালেস

আপনি যদি সত্যিই আপনার যুক্তি থেকে সংগ্রহগুলি বাদ দিতে চান তবে @ এমবিজেউ তার উত্তরে কী লিখেছিল তা পরীক্ষা করে দেখুন। আমি এটি পরীক্ষা করিনি, তবে একটি ভাল ধারণা মত seams। দ্রষ্টব্য: সংগ্রহগুলি ব্যবহারের ক্ষেত্রে আমি এখনও কোনও সমস্যা দেখি না।
মারিয়াস

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

1
এই ক্ষেত্রে সংগ্রহগুলি ব্যবহার করে আমারও উদ্বেগ রয়েছে। সম্ভবত প্রশ্নে সংগ্রহে _itemObjectClassথাকা মডেলটি আসলে কল করার অনুরূপ loadByMultiple। সুতরাং ফলস্বরূপ, $x = Mage::getModel('some/model')কোনও মডেলের একটি উদাহরণ হতে পারে না এবং $x->loadByMultiple($tag, $customName, $group)আসলে কোনও আলাদা / নতুন উদাহরণ হতে পারে?
কোজিরো

@kojiro। হ্যাঁ এটি অন্যরকম উদাহরণ হবে তবে তা হয় loadByAttribute। রেফারেন্সের জন্য এই প্রশ্নটি দেখুন: magento.stackexchange.com/q/5926/146
মারিয়াস

7

মডিউল / মডেল / SomeModel.php

public function loadByAttributes($attributes)
{
    $this->setData($this->getResource()->loadByAttributes($attributes));
    return $this;
}

মডিউল / মডেল / রিসোর্স / SomeModel.php:

public function loadByAttributes($attributes)
    {
        $adapter = $this->_getReadAdapter();
        $where   = array();
        foreach ($attributes as $attributeCode=> $value) {
            $where[] = sprintf('%s=:%s', $attributeCode, $attributeCode);
        }
        $select = $adapter->select()
            ->from($this->getMainTable())
            ->where(implode(' AND ', $where));

        $binds = $attributes;

        return $adapter->fetchRow($select, $binds);
    }

এবং অবশেষে আপনি নিম্নলিখিত মডেল লোড করতে পারেন:

$attributes = array('tag_name'=> 'any', 'custome_name'=> 'some','group_name'=>'some');
$model      = Mage::getModel('module/somemodel')->loadByAttributes($attributes);

আপডেট করা হয়েছে

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


আমি মনে করি আপনি এই লাইনে একটি getData () মিস করছেন: $this->setData($this->getResource()->loadByAttributes($attributes));যা হওয়া উচিত: $this->setData($this->getResource()->loadByAttributes($attributes)->getData()); ঠিক?
মিহাই মেটে

2

আপনি ঠিক সঙ্গে এটি করছেন addFilter। Magento এ আপনি একবারে একাধিক অ্যাট্রিবিউট নয় কোনও বৈশিষ্ট্য দ্বারা লোড করতে পারেন। ফিল্টারগুলি যুক্ত করে আপনি কোনও অতিরিক্ত ওভারহেড ছাড়াই একই প্রভাব অর্জন করবেন।


কোনও ডিবি সিলেক্ট ব্যবহার করা কি কোনও কালেকশন ব্যবহারের চেয়ে ভাল হবে না?
মার্টি ওয়ালেস

আপনি কি addFilterকরছেন বলে মনে করেন ? :-)
ব্যবহারকারী 487772

মার্গেপায়াল_মোডেল_সম্পর্ক_পরীক্ষা_সেটলেটমেন্টে লোডবাই অ্যাকাউন্ট অ্যাকাউন্ট এবং তারিখ () -র দিকে নজর রাখতে পারেন কারণ এটি সংগ্রহের পরিবর্তে একটি নির্বাচন ব্যবহার করছে
মার্টি ওয়ালেস

এবং আসলে মূল কোডে এই পরিস্থিতি প্রায় একচেটিয়াভাবে এর মতো এবং আমি কোনও সংগ্রহ সংগ্রহ ব্যবহার করতে পারি না
মার্টি ওয়ালেস

1
সংগ্রহগুলি ব্যবহার করার বিষয়ে আমি আমার উদ্বেগ নিয়ে আমার প্রশ্ন আপডেট করেছি
মার্টি ওয়ালেস

1

প্রথমত - কোনও সংগ্রহ ফিল্টার করার আপনার কৌশলটি সঠিক। কারণ ম্যাজেন্টো অলস-লোডে সংগ্রহগুলি আপনার কাস্টম লোডের প্রয়োজনীয়তা আরও দৃ tight়ভাবে সংজ্ঞায়িত করতে আপনার সংস্থান মডেলটিতে পদ্ধতি তৈরি করার ক্ষমতা রাখে।

আপনার কিছু কোড নমুনা ছাড়াই আপনার রিসোর্স মডেলটিতে নিম্নলিখিত সিউডো-পদ্ধতিটি বিবেচনা করুন:

<?php


class Marty_Wallace_Model_Resource_Method extends Mage_Core_Model_Resource_Db_Abstract{

    protected function _construct()
    {
        $this->_init('yourmodel/table', 'entity_id');
    }

    public function loadByCriteria(array $filter)
    {

        //$filter should be array('columnname'=>'value','columname'=>'value')

        $collection = Mage::getModel('yourmodel/class')->getCollection();

        foreach($filter as $column=>$value){
            $collection->addFieldToFilter($column,$value);
        }

        return $collection;

    }
}

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