Mam model niestandardowy i model zasobów. Chcę załadować pojedyncze wystąpienie modelu przy użyciu więcej niż 1 pola.
Model ma następujące pola:
id
tag_name
custom_name
group_name
Chcę załadować ten model na podstawie tag_name, custom_name i group_name zamiast id.
Obecnie używam kolekcji i addFilter dla każdego pola. To działa, ale zastanawiałem się, czy istnieje standardowa strategia dla tego typu rzeczy w Magento?
EDYTOWAĆ
Core magento wydaje się nie używać kolekcji w tym scenariuszu, ale zamiast tego używa bezpośrednich zapytań SQL w modelach zasobów.
przykładem tego jest:
loadByAccountAndDate()
w Mage_Paypal_Model_Resource_Report_Settlement
Czy istnieje ku temu powód, gdy zbiory wydają się być bardziej zwięzłe, jeśli chodzi o ilość kodu do napisania
Po prostu nie wiem, dlaczego magento decyduje się to zrobić w ten sposób
źródło
_itemObjectClass
, ma taki sam, jak model, który faktycznie wywołujeloadByMultiple
. W rezultacie, czy nie byłby$x = Mage::getModel('some/model')
to jeden przypadek modelu, a$x->loadByMultiple($tag, $customName, $group)
właściwie inny / nowy egzemplarz?loadByAttribute
. Zobacz to pytanie w celach informacyjnych: magento.stackexchange.com/q/5926/146Moduł / Model / SomeModel.php
Moduł / Model / Zasób / SomeModel.php:
I na koniec możesz załadować model:
Zaktualizowano
Nawiasem mówiąc, możesz łatwo użyć tej metody (loadByAttributes) zamiast gromadzenia i jest to bardziej zrozumiałe. Magento wywołuje także niektóre zdarzenia podczas ładowania kolekcji lub encji, a rozszerzenie strony trzeciej może aktualizować kolekcję lub encję przez obserwatora. Jeśli ładujesz byt za pomocą zasobu (podanego na przykładzie mojego i twojego), żadne zdarzenia / obserwatorzy nie strzelają i możesz uzyskać „czysty” byt szybciej niż gromadzenie. Również Magento nie używa w ten sposób kolekcji buforowanej, ładuje ją bezpośrednio z tabeli db.
Być może to jest powód zastosowania tej metody przez moduły podstawowe Magento.
źródło
$this->setData($this->getResource()->loadByAttributes($attributes));
która powinna brzmieć:$this->setData($this->getResource()->loadByAttributes($attributes)->getData());
prawda?Robisz to dobrze
addFilter
. W Magento możesz ładować według dowolnego atrybutu, ale nie wielu atrybutów jednocześnie. Dodając filtry osiągasz ten sam efekt bez dodatkowego obciążenia.źródło
addFilter
robi? :-)Po pierwsze - Twoja strategia filtrowania kolekcji jest poprawna. Ponieważ kolekcje w Magento leniwe ładowanie masz możliwość tworzenia metod w modelu zasobów, aby ściślej zdefiniować wymagania niestandardowego obciążenia.
Bez części kodu do próbkowania, weź pod uwagę następującą pseudo-metodę w swoim modelu zasobów:
źródło