У меня есть одна коллекция в методе, где я хочу выполнить две разные операции над этой коллекцией. Итак, я хочу получить две отдельные копии одной коллекции, а затем снова назначить одну из двух коллекций исходной коллекции и вернуть ее.
Для простоты предположим, что у меня есть коллекция объектов с именем $collection
.
Теперь я пытаюсь сделать это с помощью клонирования PHP, так как не знаю, есть ли встроенное клонирование Magento или нет.
$coll1 = clone $collection;
$coll2 = clone $collection;
Сейчас я пытаюсь выполнить разные операции с этими двумя отдельными клонами оригинальной коллекции, что-то вроде.
$coll1->getSelect()->where('some where condition');
$coll2->getSelect()->where('some different where condition');
if($coll1->count() == 0) {
$collection = $coll2;
} else {
$collection = $coll1;
}
Но странность в том, что обе эти клонированные коллекции имеют оба назначенных условия! Условие $ coll1 применяется к $ coll2 вместе с условием $ coll2 и наоборот.
Кто-нибудь знает, как этого добиться?
Благодарность!
источник
$collection->getSelect()
а не в самой коллекции.Чтобы расширить ответ @ davidalger, вы можете сбросить выбор, если хотите выполнить операцию, отличную от подсчета, например:
Будьте осторожны, это может иметь пагубные последствия на более поздних этапах процесса, поскольку это изменяет коллекцию.
Лучшим способом было бы как-то клонировать выделение, но мелкая копия не обрезала бы его, поскольку объект содержит сложные типы (у Varien_Db_Select или Zend_Db_Select есть
__clone
метод).Один из способов обойти это - сохранить выбранные данные, изменить их, выполнить запрос, а затем вернуть исходные выбранные данные.
Смотрите здесь для примера: https://ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/
источник