Powodem jest odpowiedź ColinM działa to spowodowane kodu w app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
„s addAttributeToFilter
metody. Jeśli użyjesz tego formatu tablicy, nie będzie on wywoływał addAttributeToSelect
. W trybie płaskim addAttributeToSelect
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:
- nie wymaga, aby atrybut miał określone ustawienia w adminie (może być dodany przez użytkownika lub ukryty w interfejsie użytkownika)
- działa zarówno w trybie płaskim, jak i innym niż płaski
Użyłem powiązanej kolekcji produktów, ale dotyczy to każdej kolekcji EAV.
Błąd kodu:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
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:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
->addAttributeToSelect( 'my_custom_attribute' )
;
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śli my_custom_attribute
nie jest ustawiony na tych produktach. Zmień to, inner
jeśli interesują Cię tylko wiersze, w których my_custom_attribute
jest ustawiony.
Dodanie do filtra (zgodnie z ColinM powyżej):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
Powyższy kod doda go do zaznaczenia, a także będzie przestrzegał twojego filtra.
(testowany w CE 1.6.2.0)
non-flat attribute
? Dzięki. I nie wprowadzaj w błąd Magento. To już jest mylące