সংগ্রহের ক্ষেত্রে getSize () এবং গণনা () এর মধ্যে পার্থক্য


81

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

সুতরাং, মূলত আমি এটিই পাচ্ছি:

$collection->count(); //correct count
$collection->getSize(); //0

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

কোনও ধারণা কেন আমি এই অদ্ভুত সমস্যাটি পাচ্ছি?

ধন্যবাদ

হালনাগাদ:

আমার আগের প্রশ্ন, কীভাবে ম্যাজেন্টোতে সংগ্রহটি ক্লোন করবেন?আমি একটি সংগ্রহ দুটি ভিন্ন অপারেশন করতে চেয়েছিলেন। প্রথম সংগ্রহটি সঠিক getSize () দেখায়, তবে তারপরে যদি getSize () শূন্য হয়, আমি WHERE ধারাটি সরিয়ে নতুন WHERE শর্ত দিয়েছিলাম। এর পরে, আমি যা প্রত্যাশা করেছি তা সঠিক কাঁচা এসকিউএল পাচ্ছি, এবং এটি মাইএসকিউএল চালানোও রেকর্ডগুলির একটি সঠিক সেট দেয়, তবে কেবল সংগ্রহের মধ্যে গেটসাইজ () শূন্য সংখ্যা প্রদান করে।

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

উত্তর:


83

বেশিরভাগ (সমস্ত না থাকলে) সংগ্রহগুলি প্রসারিত হয় Varien_Data_Collection_Db। এই ক্লাস থেকে 2 পদ্ধতি এখানে দেওয়া হল

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
    }
    return intval($this->_totalRecords);
} 

public function count() //inherited from Varien_Data_Collection
{
    $this->load();
    return count($this->_items);
}

পার্থক্য আছে. জন্য getSize()সংগ্রহ লোড হয় না। জন্য count()এটা। সাধারণত সংগ্রহের মডেলগুলি getSize()উপরের মতো একই পদ্ধতি ব্যবহার করে এবং কেবল ওভাররাইড করে getSelectCountSql()
ইন getSelectCountSql()সীমা অর্ডার ফিল্টার সেট (জন্য উপলব্ধ রেকর্ডের মোট নম্বর পেতে পুনঃসেট করা হয় whereবিবৃতি)। কিভাবে getSelectCountSql()কাজ করে দেখুন

public function getSelectCountSql()
{
    $this->_renderFilters();
    $countSelect = clone $this->getSelect();
    $countSelect->reset(Zend_Db_Select::ORDER);
    $countSelect->reset(Zend_Db_Select::LIMIT_COUNT);
    $countSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
    $countSelect->reset(Zend_Db_Select::COLUMNS);
    $countSelect->columns('COUNT(*)');
    return $countSelect;
} 

3
গ্রেট! সুতরাং সংগ্রহটি পুনরায় লোড করার জন্য আমার পরবর্তী পদক্ষেপটি কী হওয়া উচিত যাতে এটি সঠিক হয়ে যায় getSize()? ধন্যবাদ!
MagExt

আপনি কেন এই ফলাফলটি পান তা আমি সত্যই জানি না। ইন CatalogSearchমডিউল কিছুই যে অগ্রাহ্য আছে getSize()বা getSelectCountSql()। আপনি কিছু কাস্টম কোড যুক্ত না করলে এটি ডিফল্টরূপে কাজ করা উচিত। আপনি যেভাবে সংগ্রহটি তৈরি করছেন সেভাবে পোস্ট করতে পারেন?
মারিয়াস

প্রশ্ন আপডেট।
MagExt

3
পুনরায় সেট করার কোনও উপায় নেই _totalRecordsgetSize()মূল সংগ্রহটিতে কল করার আগে আপনি সংগ্রহটি ক্লোন করার চেষ্টা করতে পারেন । হতে পারে যে কাজ করবে।
মারিয়াস

"রিসেট" গণনা পেতে আপনি এই জাতীয় কিছু করতেও পারেন:$sql = $collection->getSelectCountSql(); return $collection->getConnection()->fetchOne($sql);
কোসা

14

সাবধান হও. এটি সঠিক, তবে Varien_Data_Collection_Dbমারিয়াস বর্ণিত পদ্ধতিগুলিতে ওভাররাইট করা হয়েছে

শুধু একবার দেখুন

// \Varien_Data_Collection::getSize
public function getSize()
{
    $this->load();
    if (is_null($this->_totalRecords)) {
        $this->_totalRecords = count($this->getItems());
    }
    return intval($this->_totalRecords);
}

// \Varien_Data_Collection::count
public function count()
{
    $this->load();
    return count($this->_items);
}

সুতরাং এটি এই নিম্ন স্তরের সমান হওয়া উচিত। উভয় পদ্ধতিই সংগ্রহটি লোড করে এবং আইটেমগুলি গণনা করে।

হালনাগাদ

ওহ আমি একটি সমস্যা দেখতে পাচ্ছি: গেটসাইজ () _ টোটাল রেকর্ডসকে ক্যাশে করে, এর অর্থ এটি পুনরায় গণনা করা হয় না। কোথায় _totalRecordsসেট করা আছে তা পরীক্ষা করে দেখুন ?


হ্যাঁ আমি এটি দেখেছি, তবে বুঝতে পারি না কেন দু'জনেই একই সংগ্রহের জন্য আলাদা আলাদা গণনা তৈরি করছে? সঠিক গণনা পেতে কীভাবে কোনও সংকলন সংগ্রহ বা পুনরায় লোড করবেন getSize()?
MagExt

এন্ট্রি আপডেট করেছে
ফ্যাবিয়ান ব্লাচস্মিড্ট

1
getSize()ডেটা বেস থেকে আসা রেকর্ডগুলির জন্য সংগ্রহ লোড করে না। আপনি পদ্ধতিটি ওভাররাইড না করে এবং সংগ্রহটি লোড করতে বলুন না Not
মারিয়াস

_টোটাল রেকর্ডস সুরক্ষিত তাই এটি সংগ্রহের সাথে আমার কাস্টম ফাইলে কল করতে পারবেন না। echo count($collection->load()->getItems());সঠিক গণনা দেয়, তবে আবার আমি getSize()কাজ করতে চাই ।
MagExt

5

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

আপনার ক্যোয়ারীতে যখন আপনার একটি গ্রুপ স্টেটমেন্ট থাকে এবং আপনি একটি করেন

SELECT COUNT(DISTINCT e.entity_id) ... GROUP BY ( at_id_art.value )

মাইএসকিএল প্রতিটি গ্রুপের জন্য একটি গণনা ফিরিয়ে দেবে, সুতরাং ভারিয়ান_ডাটা_কলেকশন_ডিবি :: getSize () ভুল উত্তরটি ফিরিয়ে দেবে, কারণ এই ফাংশনটি প্রথম সারিতে আনে:

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
    }
    return intval($this->_totalRecords);
}

যখন এটি জনবহুল হয়

$this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);

এটি প্রথম সারিটি নির্বাচন করে এবং তাই প্রথম আকারের মোট আকার হিসাবে প্রত্যাবর্তন করে।

আমি আমার ক্যোয়ারীর বৈশিষ্ট্যের অনন্য মানের উপর ভিত্তি করে এই কোডটি গণনা করতে এসেছি।

$select = clone $collection->getSelect();
$group = $select->getPart(Zend_Db_Select::GROUP);
$select->reset(Zend_Db_Select::GROUP)->reset(Zend_Db_Select::COLUMNS)->columns("COUNT(DISTINCT {$group[0]})");
$totalCount = $collection->getConnection()->fetchOne($select);

2

আপনি যদি এখানেই শেষ হন তবে চেষ্টা করার জন্য আরও একটি সহজ সমাধান রয়েছে:

System -> Index Management

এবং সেগুলি সমস্ত নির্বাচন করুন (এমনকি যদি তারা "সবুজ, কোনও পুনরায় সূচকের প্রয়োজন হয় না" নির্দেশ করেও তাদের পুনরায় তালিকাবদ্ধ করতে বাধ্য করে।

এটি আমার খালি getSize()সমস্যার সমাধান করেছে , যার ফলস্বরূপ, বিশেষ এবং নতুন ডাটাবেসগুলির অনুরোধগুলি পণ্যগুলি সন্ধান করতে, "যদি" শর্ত পূরণ করে এবং সঠিকভাবে রেন্ডার করে allowed


0

আমার যখন পণ্যগুলির count($collection)চেয়ে আলাদা $collection->getSize()ছিল reindexতখন সবকিছু ঠিকঠাক কাজ করেছিল।


-1

একটি মূল পার্থক্য আছে getSize () এর জন্য পণ্য সংগ্রহ লোড হয় না। গণনা () এর জন্য এটি পুরো পণ্য সংগ্রহ লোড করবে। সুতরাং বড় ক্যাটালগের জন্য এটি কোনও সংগ্রহে গণনা ফাংশন ব্যবহার করার পরামর্শ দেওয়া হয় না।


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