Wykonuję następujące czynności:
$productCollection = Mage::getModel('catalog/product')
->getCollection();
$productCollection
->addAttributeToFilter('my_attribute', 1);
my_attribute
nie ma w płaskich tabelach, ale płaskie stoliki są włączone.
Cały czas otrzymuję pełną kolekcję.
Przyczyną wydaje się być \Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect
:
$columns = $this->getEntity()->getAttributeForSelect($attributeCode);
Nie $this->getEntity()
jest instancją, Mage_Catalog_Model_Resource_Product_Flat
która pobiera płaskie pola - a jeśli nie zostanie znaleziona, po prostu zwraca null.
Jaki jest czysty sposób na dodanie niepłaskiego atrybutu do filtra kolekcji?
W moim przypadku nie ma sensu dodawanie atrybutu do płaskiego stołu.
ce-1.7.0.2
collection
Alex
źródło
źródło
non-flat attribute
? Dzięki. I nie wprowadzaj w błąd Magento. To już jest myląceOdpowiedzi:
Możesz sam dołączyć do niezbędnego stołu.
Możesz także dołączyć do store_id.
źródło
Hack (CE 1.6.2.0+) ma na celu przekazanie warunku jako tablicy i uwierzenie, że nie działa to zgodnie z przeznaczeniem:
źródło
addFieldToFiler
jest to opakowanieaddAttributeToFilter
i ma ona opcję przekazania atrybutu jako tablicy:if (is_array($attribute)) { $sqlArr = array(); foreach ($attribute as $condition) { $sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType); } $conditionSql = '('.implode(') OR (', $sqlArr).')'; }
Powodem jest odpowiedź ColinM działa to spowodowane kodu w
app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
„saddAttributeToFilter
metody. Jeśli użyjesz tego formatu tablicy, nie będzie on wywoływaładdAttributeToSelect
. W trybie płaskimaddAttributeToSelect
dyskretnie kończy się niepowodzeniem, jeśli atrybutu nie ma w płaskim stole.(poniżej znajduje się ponowna analiza mojej odpowiedzi na /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - Jestem nie jestem pewien, do czego służy etykieta, ale wiem, że byłbym pomocny)
Chciałem „czystego” rozwiązania do wybierania kolekcji w trybie płaskim i filtrowania atrybutów niepłaskich, które:
Użyłem powiązanej kolekcji produktów, ale dotyczy to każdej kolekcji EAV.
Błąd kodu:
W trybie płaskim powyższy kod po cichu nie wybiera lub nie filtruje atrybutu, jeśli zdarza się, że nie znajduje się on w płaskiej tabeli.
Dodawanie do wybranych:
joinAttribute
Metoda dodaje dołączyć do kwerendy dla żądanej konkretnego atrybutu. Nadal działa, gdy atrybut znajduje się już w płaskim stole, ale będzie nieco mniej wydajny niż samo użycie płaskiego stołu.Użyłem
left
sprzężenia, aby upewnić się, że pobiera produkty, jeślimy_custom_attribute
nie jest ustawiony na tych produktach. Zmień to,inner
jeśli interesują Cię tylko wiersze, w którychmy_custom_attribute
jest ustawiony.Dodanie do filtra (zgodnie z ColinM powyżej):
Powyższy kod doda go do zaznaczenia, a także będzie przestrzegał twojego filtra.
(testowany w CE 1.6.2.0)
źródło
W
Mage_Rss
module zastosowali metodę hacky do wyłączenia płaskich tabel. Wykorzystują fakt, że płaskie tabele są zawsze wyłączone w sklepie administracyjnym, więc po prostu emulują sklep administracyjny.Po rozpoczęciu emulacji powinieneś ją zresetować
emulationModel->stopEnvironmentEmulation()
źródło
podczas tworzenia atrybutu powinien on znajdować się na poziomie globalnym i być filtrowalny. W ten sposób będzie można go używać w nawigacji warstwowej. Będzie również wymagał atrybutu rozwijanego lub wielokrotnego wyboru. Osobiście odradzałbym zmianę podstawowych plików w celu dopasowania do twoich potrzeb w tym przypadku
źródło