Я много раз слышал, что они оба одинаковы. Но я столкнулся со странной проблемой: в коллекции продуктов модуля CatalogSearch count () возвращает правильное количество продуктов, а getSize () возвращает ноль.
Итак, в основном это то, что я получаю:
$collection->count(); //correct count
$collection->getSize(); //0
Но я хочу, чтобы getSize () имел правильное количество, так как он решает, показывать нумерацию страниц и продукты на странице поиска или нет. Я использую условия Inner Join, Left Join и Where только в коллекции, чтобы быть более конкретными.
Есть идеи, почему я получаю эту странную проблему?
Спасибо
ОБНОВИТЬ:
Мой предыдущий вопрос: Как клонировать коллекцию в Magento? Я хотел выполнить две разные операции над одной коллекцией. Первая коллекция показывает правильный getSize (), но затем, если getSize () равен нулю, я удалил предложение WHERE и дал новое условие WHERE. После этого я получаю правильный исходный SQL, что и ожидал, и запуск его в MySQL также дает правильный набор записей, но только getSize () в коллекции дает нулевое число.
Так что в основном мне может понадобиться перезагрузить коллекцию, так как getSize () принимает старый счет. Имеет смысл?
источник
getSize()
? Спасибо!CatalogSearch
модуле нет ничего, что переопределяетgetSize()
илиgetSelectCountSql()
. Он должен работать по умолчанию, если только вы не добавили какой-то пользовательский код. Можете ли вы опубликовать способ создания коллекции?_totalRecords
. Вы можете попытаться клонировать коллекцию перед вызовомgetSize()
исходной коллекции. Может быть, это сработает.$sql = $collection->getSelectCountSql(); return $collection->getConnection()->fetchOne($sql);
Быть осторожен. Это правильно, но методы перезаписываются,
Varien_Data_Collection_Db
как описано Мариусом.Просто взгляните на
Так что на этом низком уровне должно быть то же самое. Оба метода загружают коллекцию и подсчитывают элементы.
ОБНОВИТЬ
О, я вижу проблему: getSize () кэширует _totalRecords, это означает, что он не пересчитывается. Проверьте, где
_totalRecords
установлен?источник
getSize()
?getSize()
не загружает коллекцию для записей, поступающих из базы данных. Нет, если вы не переопределите метод и не скажете ему загрузить коллекцию.echo count($collection->load()->getItems());
дает правильный счет, но я снова хочуgetSize()
работать.Этот ответ отображается в Google как "magento getSize неправильно" и подобные поиски, поэтому я хотел бы добавить возможный сценарий, который может быть полезен для кого-то
Когда в вашем запросе есть оператор группы, и вы делаете
Mysql вернет счетчик для КАЖДОГО из групп, поэтому Varien_Data_Collection_Db :: getSize () вернет неправильный ответ, потому что эта функция выбирает первую строку:
Когда он заселит
Он выбирает первую строку и, следовательно, возвращает сумму первой группы как общий размер.
В итоге я придумал этот код для подсчета, основанный на уникальных значениях атрибутов в моем запросе.
источник
На случай, если вы окажетесь здесь, попробуйте другое простое исправление:
и выберите их все (даже если они указывают «Зеленый, переиндексировать не нужно») и принудительно переиндексировать.
Это решило мою пустую
getSize()
проблему, которая, в свою очередь, позволила запросам в Специальной и Новой базе данных найти продукты, выполнить условия «если» и правильно отобразить.источник
Когда
count($collection)
было иначе , чем$collection->getSize()
я должен былreindex
продукты, то все работало нормально.источник
Есть главное отличие Для getSize () коллекция продуктов не загружена. Для count () он загрузит всю коллекцию продуктов. Поэтому для большого каталога не рекомендуется использовать функцию подсчета в любой коллекции.
источник