Mam jedną kolekcję w metodzie, w której chcę wykonać dwie różne operacje na tej kolekcji. Tak więc chcę dwie osobne kopie tej samej kolekcji, a następnie ponownie przypisać jedną z dwóch kolekcji do oryginalnej kolekcji i zwrócić ją.
Aby to uprościć, załóżmy, że mam kolekcję obiektów o nazwie $collection
.
Teraz próbuję z klonowaniem PHP, ponieważ nie wiem, czy jest wbudowane klonowanie kolekcji Magento, czy nie.
$coll1 = clone $collection;
$coll2 = clone $collection;
Teraz próbuję wykonać różne operacje na tych dwóch osobnych klonach oryginalnej kolekcji, coś w tym rodzaju.
$coll1->getSelect()->where('some where condition');
$coll2->getSelect()->where('some different where condition');
if($coll1->count() == 0) {
$collection = $coll2;
} else {
$collection = $coll1;
}
Ale dziwne jest to, że obie sklonowane kolekcje mają oba przypisane warunki! Warunek $ coll1 jest stosowany do $ coll2 wraz z warunkiem $ coll2 i odwrotnie.
Czy ktoś wie, jak to osiągnąć?
Dzięki!
źródło
$collection->getSelect()
a nie w samej kolekcji.Aby rozwinąć odpowiedź @ davidalger, możesz zresetować zaznaczenie, jeśli chcesz wykonać inną operację niż liczenie - na przykład:
Uważaj jednak, może to mieć szkodliwe skutki na późniejszym etapie procesu, ponieważ modyfikuje to kolekcję.
Lepszym sposobem byłoby jakoś sklonowanie zaznaczenia, ale płytka kopia nie wyciąłaby go, ponieważ obiekt zawiera złożone typy (Varien_Db_Select ani Zend_Db_Select mają
__clone
metodę).Jednym ze sposobów obejścia tego jest zapisanie wybranych danych, zmodyfikowanie ich, uruchomienie zapytania, a następnie przywrócenie oryginalnych wybranych danych.
Zobacz tutaj przykład: https://ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/
źródło