Wiele razy słyszałem, że oba są takie same. Ale mam do czynienia z dziwnym problemem: w kolekcji produktów modułu CatalogSearch count () zwraca poprawną liczbę produktów, a getSize () zwraca zero.
Zasadniczo oto, co otrzymuję:
$collection->count(); //correct count
$collection->getSize(); //0
Ale chcę, aby getSize () miał poprawną liczbę, ponieważ decyduje, czy wyświetlać paginację i produkty na stronie wyszukiwania, czy nie. Używam warunku łączenia wewnętrznego, łączenia lewego i Where tylko w kolekcji, aby być bardziej szczegółowym.
Jakieś pomysły, dlaczego mam ten dziwny problem?
Dzięki
AKTUALIZACJA:
Moje poprzednie pytanie: Jak sklonować kolekcję w Magento? Chciałem wykonać dwie różne operacje na jednej kolekcji. Pierwsza kolekcja pokazuje poprawną metodę getSize (), ale jeśli wartość getSize () wynosi zero, usunąłem klauzulę WHERE i podałem nowy warunek WHERE. Następnie otrzymuję poprawny nieprzetworzony kod SQL, czego się spodziewałem, a uruchomienie go w MySQL daje również prawidłowy zestaw rekordów, ale tylko getSize () w kolekcji daje zerową liczbę.
Zasadniczo więc może być konieczne ponowne załadowanie kolekcji, ponieważ metoda getSize () stara się liczyć. Ma sens?
źródło
getSize()
? Dzięki!CatalogSearch
module nie ma nic, co nadpisujegetSize()
lubgetSelectCountSql()
. Powinno działać domyślnie, chyba że dodasz niestandardowy kod. Czy możesz opublikować sposób budowania kolekcji?_totalRecords
. Możesz spróbować sklonować kolekcję przed wywołaniemgetSize()
oryginalnej kolekcji. Może to zadziała.$sql = $collection->getSelectCountSql(); return $collection->getConnection()->fetchOne($sql);
Bądź ostrożny. To prawda, ale metody są nadpisywane
Varien_Data_Collection_Db
zgodnie z opisem MariuszaSpójrz tylko
Tak powinno być na tym niskim poziomie. Obie metody ładują kolekcję i liczą elementy.
AKTUALIZACJA
Och, widzę problem: getSize () buforuje _totalRecords, co oznacza, że nie jest on ponownie obliczany. Sprawdź, gdzie
_totalRecords
jest ustawiony?źródło
getSize()
?getSize()
nie ładuje kolekcji rekordów pochodzących z bazy danych. Nie, chyba że przesłonisz metodę i powiesz jej, aby załadowała kolekcję.echo count($collection->load()->getItems());
daje prawidłową liczbę, ale znowu chcęgetSize()
pracować.Ta odpowiedź pojawia się w Google dla „magento getSize źle” i podobnych wyszukiwań, więc chciałbym dodać możliwy scenariusz, który może być przydatny dla kogoś
Kiedy masz zapytanie grupowe w swoim zapytaniu i robisz
Mysql zwróci liczbę dla KAŻDEJ grupy, więc Varien_Data_Collection_Db :: getSize () zwróci złą odpowiedź, ponieważ funkcja ta pobiera pierwszy wiersz:
Kiedy się zapełni
Wybiera pierwszy wiersz i dlatego zwraca sumę pierwszej grupy jako całkowity rozmiar.
Skończyło się na tym, że liczę ten kod na podstawie unikalnych wartości atrybutów w moim zapytaniu.
źródło
Na wypadek, gdybyś tu trafił, jest jeszcze jedna prosta poprawka:
i zaznacz je wszystkie (nawet jeśli wskazują „Zielony, nie trzeba ponownie indeksować”) i zmusić ich do ponownego indeksowania.
To rozwiązało mój pusty
getSize()
problem, który z kolei pozwolił Specjalnym i Nowym Żądaniom bazy danych znaleźć produkty, spełnić warunki „jeśli” i poprawnie renderować.źródło
Kiedy
count($collection)
było inaczej niż$collection->getSize()
miałem doreindex
produktów, wtedy wszystko działało dobrze.źródło
Istnieje główna różnica W przypadku getSize () kolekcja produktów nie jest ładowana. Dla count () załaduje całą kolekcję produktów. Dlatego w przypadku dużego katalogu nie zaleca się używania funkcji liczenia w żadnej kolekcji.
źródło