স্থানীয়ভাবে পৃষ্ঠাবদ্ধতার সাথে ম্যাজেন্টো সংগ্রহগুলি নিয়ে পুনরুক্তি করা কি সম্ভব?


21

আমি এর দ্বারা যা বোঝাতে চাই তা হ'ল - এখানে করার উপায় আছে:

$collection = $model->getCollection();
foreach ($collection as $item) { 
    $item->doStuff();
}

এমনভাবে যে সংগ্রহে 100 কিলো সারি থাকলেও এটি মাইএসকিউএল থেকে কেবল একবারে সারিগুলির একটি পৃষ্ঠা লোড করতে পারে এবং পর্দার আড়ালে আপনার জন্য যাদুকরীভাবে সেগুলি প্যাগিটিং করে।

Varien_Data_Collection_Db::load()এটি তাকানো থেকে মনে হচ্ছে এটি সম্ভব নয়, তবে কেবল যাচাই করতে চেয়েছিল। এটি এমন একটি জিনিসের মতো যা সাধারণ প্রয়োজন হওয়া উচিত seems

উত্তর:


18

আপনার সত্যিই ব্যবহার করা উচিত

Mage::getSingleton('core/resource_iterator')

এই উদ্দেশ্যে, যেমনটি আপনি উল্লেখ করেছেন কার্য সম্পাদনের কারণে বিশুদ্ধভাবে বিদ্যমান।

অন্যথায়, আপনি setPageSizeএর সাথে একটি লুপ ব্যবহার করে কিছুটা কম মার্জিত সমাধান ব্যবহার করতে পারেন - এখানে একটি ভাল উদাহরণ রয়েছে, /programming/3786826/how-to-loop-a- musento-colલેક્શન


1
আপনি, স্যার, একটি সজ্জন এবং একটি পণ্ডিত.
kalenjordan

setPageSizeএটি পছন্দসই কারণে +1 ।
ফিলিউঙ্কল

আরেকটি জিনিস যা আমি বুঝতে পেরেছি তা হল core/resource_iteratorসমাধানটি আসলে মাইএসকিএল কোয়েরিটি পৃষ্ঠাভুক্ত করে না। এটি একবারে পুরো ফলাফলটি লোড করে, কিন্তু তারপরে এটি আপনাকে আপনার পিএইচপি কোডের সাথে ডিল করার জন্য এক সময় সারি দেয়। সুতরাং এটি পিএইচপি-র মধ্যে মেমরির ত্রুটিগুলি এড়াতে পারে না, তবে ফলাফলের সেটটি খুব বড় হলে কোনও সময়ে এটি মাইএসকিএল সর্বাধিক প্যাকেটের আকারকে ট্রিগার করবে। আমি মনে করি আমি চেষ্টা করে একটি সুন্দর বিমূর্ত ব্যবহার করে যাচ্ছি রিসোর্সsetPageSize()
লিটার

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

আমি একটি জেনেরিক ব্যাচযুক্ত পুনরাবৃত্তি প্রয়োগ করেছি যা মাইএসকিউএলে কোয়েরিগুলিকে ব্যাচ করে তবে একটি পৃথক সংগ্রহের আইটেম কলব্যাকও সরবরাহ করে। আপনি কী ভাবেন কৌতুহল: gist.github.com/kalenjordan/5483065
ক্যালেনজর্ডান

5

আমি বেন লেসানির সাথে একমত যে আপনি যদি সম্ভব হয় তবেcore/iterator একবারে একাধিক সারিতে বড় সংগ্রহ লোড করতে আপনার উত্স মডেলটি ব্যবহার করা উচিত ।

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

এবং স্ট্যাকওভারফ্লো থেকে লিঙ্কযুক্ত উদাহরণটি আসলে তেমন ভাল নয় কারণ এটি একই LIMITপ্রকাশকে বিভিন্ন এক্সপ্রেশন দিয়ে পুনরাবৃত্তি করে । জটিল প্রশ্নের জন্য এটি একটি পারফরম্যান্স সমস্যা হতে পারে, তবে আরও গুরুত্বপূর্ণ, এর মধ্যে নতুন সারি যুক্ত করা গেলে আপনি সদৃশগুলি পাবেন।

খণ্ডগুলিতে সংগ্রহগুলি পরিচালনা করার একটি ভাল উপায় হ'ল প্রথমে সমস্ত আইডি লোড করা, তারপরে এই আইডিগুলি প্রকৃত পেজড সংগ্রহের ফিল্টার হিসাবে ব্যবহার করুন।

পণ্যগুলির জন্য সহজ উদাহরণ:

$ids = Mage::getModel('catalog/product')
    ->getCollection()
    ->getAllIds();

$page = 1;
do {
    $collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->addIdFilter($ids)
        ->setPageSize(100)
        ->setCurPage($page);

    $results = $collection->load();

    // do stuff ......

    $page++;

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