ম্যাজেন্টো: কোনও পণ্যের বৈশিষ্ট্য আপডেট করার দ্রুততম উপায়


15

আমি ভর বৈশিষ্ট্য আপডেটের জন্য দ্রুত এবং নির্ভরযোগ্য পদ্ধতিটি খুঁজছি। নীচে পদ্ধতিগুলি সম্পর্কে সচেতন তবে আমার কোনটি দিয়ে যেতে হবে তা আমি জানি না।

$store_id = 0;
Mage::getSingleton('catalog/product_action')->updateAttributes(
    array($product_id),
    array('attribute_code' => $attribute_code),
    $store_id
);

অথবা

$product->setData($attribute_code, 1234); 
$product->getResource()->saveAttribute($product, $attribute_code); 

উত্তর:


31

দ্রুততম উপায় হ'ল ডেটাবেজে সরাসরি নির্বাচন এবং সন্নিবেশ / আপডেট করা, তবে এটি সবচেয়ে নিরাপদ নয়। আপনি সহজেই জিনিস ভাঙ্গতে পারেন।

আমি Mage::getSingleton('catalog/product_action')->updateAttributes(...)পদ্ধতির ব্যবহার ।
এটি দ্রুত, আপনি এটিকে বাল্ক আপডেট পণ্যের বৈশিষ্ট্যগুলিতে ব্যবহার করতে পারেন, আপনি একটি নির্দিষ্ট স্টোরের জন্য একটি অ্যাট্রিবিউট মান আপডেট করতে পারেন।
আমি মনে করি এটি বেশিরভাগ ক্ষেত্রেই কাভার করে।


ধন্যবাদ মেরিস আমি আপনার প্রতিক্রিয়ার প্রত্যাশা করছিলাম, বিটিডব্লিউ আপনার চূড়ান্ত মডিউলটির নির্মাতা কুল
দীপক মল্লাহ

1
এটি আসলে দ্রুততম চয়ন নয় ... নীচে আমার উত্তরটি দেখুন
ফ্রে

@ ফ্রা আপনার পদ্ধতিটি কীভাবে দ্রুত? এটি জড়িত load। দ্রুত কিন্তু কিছু। উদাহরণস্বরূপ, পদ্ধতি 2 এ, পণ্য লোডের সাথে প্রথম লাইনটি অকেজো। আপনি $productকোথাও ব্যবহার করছেন না।
মারিয়াস

@Fra। আপনি যখন কারও জবাবকে নীচে নামান তখন কোনও কারণ বলাই ভাল জিনিস। আমার উত্তর দিয়ে কি ভুল?
মারিয়াস

1
আমি আপনার উত্তরের জন্য একই জিনিস বলতে পারি ... এটি দ্রুততম উপায় নয়। ডাইরেক্ট এসকিউএল অনুসন্ধানগুলি হ'ল দ্রুততম উপায়। আপনার কারণ ডাউনভোটিংয়ের পক্ষে যথেষ্ট বলে আমি মনে করি না। তবে আপনি আপনার মতামত প্রাপ্য।
মারিয়াস

27

প্রকৃতপক্ষে সম্পূর্ণ পণ্যটি সংরক্ষণ না করে কোনও পণ্যটিতে কোনও গুণকে আপডেট করার জন্য 3 টি উপায় রয়েছে। কোড / প্রয়োজনীয়তার উপর নির্ভর করে একের থেকে অন্যটি দ্রুততর হতে পারে।

পদ্ধতি 1:

$product = Mage::getModel('catalog/product')->load($product_id);
$resource = $product->getResource();

$product->setData($attribue_code, $value);
$resource->saveAttribute($product, $attribute_code);

পদ্ধতি 2:

$updater = Mage::getSingleton('catalog/product_action');
$updater->updateAttributes(array($product_id), array( $attribute_code => $value), 0);

পদ্ধতি 3: (দ্রুততম)

 $update_resource = Mage::getResourceSingleton('catalog/product_action');
 $update_resource->updateAttributes(array($product_id), array( $attribute_code => $value), 0);

উপরের সমস্ত পদ্ধতি আরও দ্রুত যা পুরো পণ্যটিকে যেভাবেই সংরক্ষণ করতে পারে সেখানে কিছু বড় পারফরম্যান্স পার্থক্য রয়েছে:

Method 1:

  • দ্রুততম তবে আপনার পণ্যটি লোড করা দরকার।
  • এটি রিইন্ডেক্স ইভেন্টটি ট্রিগার করে না (এ কারণেই দ্রুত)
  • এটি সম্মুখভাগে কাজ করে

Method 2:

  • বাল্ক আপডেট পণ্যকে অনুমতি দেয়
    (আপনি একাধিক পণ্য এবং একাধিক বৈশিষ্ট্যগুলি পাস করতে পারেন)
  • এটি গণঅ্যাকশন ইভেন্টটিকে ট্রিগার করে এবং আপেক্ষিক নির্ভর পুনর্নির্দেশ সূচনা করে
  • এটি সম্মুখভাগে কাজ করে না

Method 3:

  • এটি পদ্ধতি 2 এর মতো, তবে অন্য কোনও পর্যবেক্ষক / সূচককে কল করে না
    (সুতরাং এটি পদ্ধতি 1 এবং 2 এর মধ্যে একটি মিশ্র পদ্ধতির)

পদ্ধতি 3 যাহাই হউক না কেন আপনাকে সেই পণ্যগুলি / গুণাবলী পুনরায় সূচি দিতে হবে to (
সামনের দিকে এগুলি আপডেট করার জন্য) আপনি যদি প্রচুর পণ্য দ্রুত আপডেট করতে চান এবং তারপরে শেষে পুনঃনির্দেশকে কল করুন তবে এটি কার্যকর হতে পারে।
(আপনি যদি পদ্ধতি 2 ব্যবহার করেন তবে প্রতিটি পণ্যের জন্য একটি পুনর্নির্দেশ আপডেটের পরে ডাকা হয় এবং এই একাধিক কলগুলি পুরো প্রক্রিয়াটি ধীর করে দেয়)

কোনও একক পণ্যকে ম্যানুয়ালি পুনর্নির্দেশ করতে ম্যাগ_গ্যাটালগ_মোডেল_প্রডাক্ট_ফ্ল্যাট_আইডেক্সার যেমন সরবরাহিত ফাংশনগুলি দেখুন :

  • updateAttribute($attributeCode, $store = null, $productIds = null)
  • updateProduct($productIds, $store = null)
  • ...

4
এটা মন্তব্য downvote সবসময় ভাল হবে ...
Fra

কেবলমাত্র একটি ছোট নোট, interface মানটি একটি মান কোড (পূর্ণসংখ্যা) হওয়া উচিত, আপনার ইন্টারফেসে যে 'পাঠ্য' মান হয় তা নয়
আলী আলওয়াশ

হুঁ মম। পদ্ধতি 2 দুর্দান্ত শোনায়, কেবলমাত্র 'ফিডব্যাক' এর উপর আপনার কোনও নিয়ন্ত্রণ নেই যা সফল হয়েছে, কী হয়নি? পদ্ধতি 1ও ভাল। তবে যখন আমি আমার লুপটি ডেটা দিয়ে আপডেট করব: আমি কী নিজে নিজেই পুনরায় সূচিটিকে কিক করতে পারি পার্টিকুলার প্রোডাক্ট আইডির জন্য এটি সমাধান করতে?
snh_nl

স্ট্রেঞ্জ। পদ্ধতি 2 ব্যবহার করে আমি কলাম by `by দ্বারা একটি ত্রুটি অজানা ফিল্টার পাচ্ছি exception exception exception ব্যতিক্রম ধরা হয়েছে: এসকিউএলস্টেট [42S22]: কলামটি পাওয়া যায় নি: 1054 'ক্ষেত্রের তালিকায়' ক্যাটালগ_পরিশোধক_মূল্য_মূল্য_আইডি, কোয়েরিটি ছিল: নির্বাচন করুন catalog_product_entity। যেখান value_idথেকে catalog_product_entity(সত্তা_ টাইপ_আইডি = 4 এবং অ্যাট্রিবিউট_আইডি = '68 'এবং সত্তা_আইডি =' 29 ') expect `expect এটি আশা করে না। 1.9.3.2 এ চলছে
snh_nl

1
আমার কাজের ঘন্টা বাঁচিয়েছে।
ডিপোল_মোমেন্ট

3

হালনাগাদ

আমি ভর বৈশিষ্ট্য আপডেটের জন্য দ্রুত এবং নির্ভরযোগ্য পদ্ধতিটি খুঁজছি

বৈশিষ্ট্য বা পণ্যগুলির জন্য "গণ গুণাবলী আপডেট"?

ভাবেন একাধিক বৈশিষ্ট্য আপডেট করার উত্তরে উত্তর দেওয়া হয় তবে পণ্যগুলির জন্য এটি দরকারী হতে পারে ...

আপনি যদি সংগ্রহ থেকে পণ্যগুলি আপডেট করতে চান তবে আপনার এটি করা উচিত নয় ...

foreach ($collection as $product) {
    $product->setSomeData(...);
    # not here
    $product->save();
}

এটি ইভেন্টগুলি প্রেরণ করবে, পুনর্নির্মাণগুলি এবং সূচকগুলি পুনর্নির্মাণ করবে। এটির সাথে কোনও ইভেন্ট (এবং কিছু অন্যান্য জিনিস) এড়ানো যায় না এবং অনেক দ্রুত হয়।

foreach ($collection as $product) {
    $product->setSomeData(...);
}
$collection->save();

প্রাইসারুল আপডেটগুলি এড়াতে, আপনি যুক্ত করতে পারেন ...

$product->setIsMassupdate(true);

ফ্লাইতে রিইনডেক্স অক্ষম / সক্ষম করতে এটিকে একবার দেখুন ... https://github.com/Flagbit/Magento-ChangeAttributeSet/commit/676f3af77fec880bc64333403675d183e8639fae

/**
 * Set indexer modes to manual
 */
private function _storeRealtimeIndexer()
{
    $collection = Mage::getSingleton('index/indexer')->getProcessesCollection();
    foreach ($collection as $process) {
        if($process->getMode() != Mage_Index_Model_Process::MODE_MANUAL){
            $this->_index[] = $process->getIndexerCode();
            $process->setData('mode', Mage_Index_Model_Process::MODE_MANUAL)->save();
        }
    }

}
/**
 * Restore indexer modes to realtime an reindex product data
 */
private function _restoreRealtimeIndexer()
{
    $reindexCodes = array(
        'catalog_product_attribute',
        'catalog_product_flat'
    );
    $indexer = Mage::getSingleton('index/indexer');
    foreach ($this->_index as $code) {
        $process = $indexer->getProcessByCode($code);
        if (in_array($code, $reindexCodes)) {
            $process->reindexAll();
        }
        $process->setData('mode', Mage_Index_Model_Process::MODE_REAL_TIME)->save();
    }
}

এবং ভর (পণ্য) আপডেটের আগে ক্যাশ ফ্লাশিং কার্যকারিতা বাড়িয়ে তুলতে পারে ...

Mage::app()->getCacheInstance()->flush();

ডিবাগিং থেকে কিছু নম্বর এখানে: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16


Mage::getSingleton('catalog/product_action')->updateAttributes(...) দ্রুততম পদ্ধতি বলে মনে হচ্ছে না ... কমপক্ষে মিউটলিস্টোর সেটআপ এবং ফ্ল্যাট টেবিল চালু না করে ...

  • saveAttribute()

    $product = Mage::getModel('catalog/product')->load($productId);
    $resource = $product->getResource();
    $product->setData($attributeCode, $attributeValue);
    $resource->saveAttribute($product, $attributeCode);
    • মোট Incl। ওয়াল সময় (মাইক্রোসেকস): 437,787 মাইক্রোস্যাকস
    • মোট Incl। সিপিইউ (মাইক্রোস্যাকস): 423,600 মাইক্রোসেকস
    • মোট Incl। মেমুউজ (বাইটস): 4,433,848 বাইট
    • মোট Incl। পিকমেমউস (বাইটস): 4,395,128 বাইট
    • ফাংশন কলগুলির সংখ্যা: 25,711
  • updateAttributes()

    Mage::getSingleton('catalog/product_action')->updateAttributes(
        array($productId),
        array($attributeCode => $attributeValue),
        $storeId
    );
    • মোট Incl। ওয়াল সময় (মাইক্রোসেকস): 3,676,950 মাইক্রোসেকস
    • মোট Incl। সিপিইউ (মাইক্রোস্যাকস): 3,122,064 মাইক্রোস্যাকস
    • মোট Incl। মেমুউজ (বাইটস): 8,174,792 বাইট
    • মোট Incl। পিকমেমউস (বাইটস): 8,199,192 বাইট
    • ফাংশন কলগুলির সংখ্যা: 150,132
  • updateAttributes() (রিসোর্স সিঙ্গলটন)

    Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
        array($productId),
        array( $attributeCode => $attributeValue),
        $storeId
    );
    • মোট Incl। ওয়াল টাইম (মাইক্রোসেকস): 94,155 মাইক্রোসেকস
    • মোট Incl। সিপিইউ (মাইক্রোস্যাকস): 48,568 মাইক্রোসেকস
    • মোট Incl। মেমুউজ (বাইটস): 1,426,304 বাইট
    • মোট Incl। পিকমেমউস (বাইটস): 1,370,456 বাইট
    • ফাংশন কলগুলির সংখ্যা: 2,221

এই ফাংশনটি কেন বিভিন্ন সময় নেয় তা বুঝতে আপনি আমার উত্তর পর্যালোচনা করতে পারেন ...
ফ্রে

ড্রপডাউন ডেটার updateAttributes() (resource singleton)জন্য প্রকৃত অ্যাডমিন মান গ্রহণ করে? বা ড্রপডাউন উপাদানটির আইডি? (কোনওভাবেই আমরা এই পদ্ধতিটি ব্যবহার করে সর্বদা কোনও মূল্য / ফাঁকা মান
পাই

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