ম্যাজেন্টোতে কীভাবে সংগ্রহটি ক্লোন করবেন?


12

আমার এই পদ্ধতিতে একটি সংগ্রহ আছে যেখানে আমি এই সংগ্রহটিতে দুটি পৃথক ক্রিয়াকলাপ করতে চাই। সুতরাং, আমি একই সংগ্রহের দুটি পৃথক অনুলিপি চাই এবং তারপরে দুটি সংগ্রহের মধ্যে একটিটিকে আবার মূল সংগ্রহকে বরাদ্দ করুন এবং এটি ফিরিয়ে দিন।

এই সহজ করতে, ধরুন আমার কাছে একটি অবজেক্ট কালেকশন বলা হয়েছে $collection

এখন, আমি পিএইচপি ক্লোনিং দিয়ে এটি চেষ্টা করছি কারণ জানি না কোনও ইনজিল্ট ক্লোনিংয়ের ম্যাজেন্টো সংগ্রহ আছে কি না।

$coll1 = clone $collection;
$coll2 = clone $collection;

এখন আমি মূল সংগ্রহের এই দুটি পৃথক ক্লোনগুলিতে বিভিন্ন অপারেশন করার চেষ্টা করছি, এরকম কিছু।

$coll1->getSelect()->where('some where condition');
$coll2->getSelect()->where('some different where condition');
if($coll1->count() == 0) {
    $collection = $coll2;
} else {
    $collection = $coll1;
}

তবে আশ্চর্যের বিষয় হ'ল, এই ক্লোন করা সংগ্রহগুলিতে উভয়ই শর্ত নির্ধারিত হয়েছে! $ coll1 শর্তটি $ coll2 এর শর্তের সাথে $ coll2 এ প্রয়োগ করা হয় এবং এর বিপরীতে।

কেউ কীভাবে এটি অর্জন করতে জানে?

ধন্যবাদ!

উত্তর:


14

পিএইচপি ক্লোন অপারেটরের ব্যবহার, যেখানে গভীর ক্লোনিং পছন্দসই, সেখানে এমন শ্রেণীর প্রয়োজন যা সম্পত্তিগুলিতে অবজেক্টগুলি সংরক্ষণ করে __ ক্লোন পদ্ধতিটি অবজেক্টগুলি অনুলিপি করে। যদি তারা এটি সংজ্ঞায়িত না করে তবে উভয় দৃষ্টান্তের বৈশিষ্ট্যগুলি একই বস্তুকে উল্লেখ করবে।

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

আমার পরামর্শ হ'ল আপনি যা করতে চাইছেন তা সম্পাদন করার জন্য অন্যান্য উপায় সন্ধান করা, কারণ কোনও সংগ্রহের ক্লোনিং করা ব্যয়বহুল হতে পারে।

আপনি যে উদাহরণটি দিয়েছেন (উদাহরণস্বরূপ) নির্বাচনটিকে ক্লোন করে পরিবর্তন করা যেতে পারে, এটি লোড হওয়া রেকর্ডগুলির একটি গণনা নির্বাচন করতে এটি সংশোধন করে এবং তার ফলাফলের ভিত্তিতে সংগ্রহটি সংশোধন করে। এটি আরও ভাল সঞ্চালন করবে যেহেতু আপনি কোনও সংগ্রহ লোড করছেন না এবং কেবল কোনটি ব্যবহার করবেন তা নির্ধারণের জন্য এটি গণনা করছেন না।

সম্পাদনা: নিম্নলিখিতটি লোড না করে বা সংগ্রহকে বাস্তবে পরিবর্তন না করে কীভাবে একটি গণনা দখল করবেন তা নিম্নলিখিতটি দেখায়।

$collection = Mage::getModel(...)->getCollection();

$count = $collection->getSelectCountSql();
$count->where('some where condition');
if ($count->query()->fetchColumn() == 0) {
    ...
} else {
    ...
}

কেবলমাত্র একটি ছোট্ট বিবরণ: কোথায় $collection->getSelect()সংগ্রহ করা যায় তা সংরক্ষণের তথ্য ।
ফ্যাবিয়ান ব্লাচস্মিড্ট

উত্তরের জন্য ধন্যবাদ. তবে কেবলমাত্র শর্তটি প্রয়োগ করার পরে আমি সংগ্রহের সংখ্যাটি জানতে চাই এবং কেবল সেই গণনার উপর ভিত্তি করে আমি সিদ্ধান্ত নিতে চাই যে যেখানে শর্ত আছে সেগুলি আলাদা হবে কি না। কীভাবে এটি করবেন তা আরও ভাল করে বুঝতে আপনি কিছু কোড স্নিপেট পোস্ট করতে পারেন?
MagExt

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

আপডেট করার জন্য ধন্যবাদ। আমি ইতিমধ্যে সমাধানটির মতো কিছু পেয়েছি বলে আমি এটি চেষ্টা করি নি।
MagExt

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

1

@ ডেভিডালজারের উত্তরটি প্রসারিত করতে, আপনি যদি একটি গণনার চেয়ে আলাদা অপারেশন করতে চান তবে আপনি নির্বাচনটি পুনরায় সেট করতে পারেন - যেমন:

$select= $collection->getSelectCountSql()->reset();

$select
    ->from('newsletter_subscriber', array('some_column'))
    ->distinct();

যদিও সাবধান থাকুন, পরবর্তীকালে প্রক্রিয়াটিতে এটি ক্ষতিকারক প্রভাব ফেলতে পারে যেহেতু এটি সংগ্রহটি পরিবর্তন করে।

আরও ভাল উপায় হতে পারে কোনওভাবে নির্বাচনকে ক্লোন করা, তবে একটি অগভীর অনুলিপি এটি কাটবে না কারণ বস্তুটিতে জটিল ধরণের রয়েছে (ভারিয়ান_ডিবি_স্লেট বা জেনড_ডিবি_লেক্টের একটি __cloneপদ্ধতি রয়েছে)।

এটিকে ঘুরে দেখার এক উপায় হ'ল নির্বাচনের ডেটা সংরক্ষণ করা, এটিকে সংশোধন করা, আপনার ক্যোয়ারী চালানো এবং তারপরে আসল সিলেক্ট ডেটা ফিরিয়ে দেওয়া।

উদাহরণের জন্য এখানে দেখুন: https://ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/

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