Як клонувати колекцію в Magento?


12

У мене є одна колекція методом, де я хочу виконати дві різні операції над цією колекцією. Отже, я хочу дві окремі копії однієї колекції, а потім призначити одну з двох колекцій знову оригінальній колекції та повернути її.

Щоб зробити це просто, припустимо, у мене є колекція об'єктів під назвою $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, і навпаки.

Хтось знає, як цього досягти?

Дякую!

Відповіді:


14

Використання оператора клонів PHP, де бажано глибоке клонування, вимагає класів, які зберігають об'єкти у властивостях, реалізуючи метод __clone для копіювання об'єктів. Якщо вони не визначають його, властивості обох екземплярів будуть посилатися на один і той же об'єкт.

Magento не впроваджує __clone у своїх конспектах колекції, а тому не підтримує глибоке клонування так, як ви цього хочете.

Моя пропозиція - шукати інші способи досягнення того, що ви хочете зробити, оскільки клонування колекції може бути досить дорогим.

Приклад, який ви подали (наприклад), можна змінити для клонування вибору, змінити його, щоб вибрати кількість записів, які він завантажив, а потім на основі цього результату змінити колекцію. Це також було б кращим, оскільки ви не завантажували б колекцію та рахували її лише для того, щоб визначити, яку саме використовувати.

РЕДАКТУВАННЯ: Далі показано, як захопити кількість без завантаження чи фактичної зміни колекції.

$collection = Mage::getModel(...)->getCollection();

$count = $collection->getSelectCountSql();
$count->where('some where condition');
if ($count->query()->fetchColumn() == 0) {
    ...
} else {
    ...
}

Лише невелика деталь: інформація про те, де зберігається, $collection->getSelect()а не в самій колекції.
Фабіан Блешшмідт

Дякую за відповідь Але після застосування там, де лише умова, я хочу знати кількість колекцій, і лише виходячи з цього рахунку, я хочу вирішити, чи використовувати інший, де умова чи ні. Чи можете ви опублікувати якийсь фрагмент коду, щоб краще зрозуміти, як це зробити?
MagExt

Оновлена ​​відповідь на прикладі коду. Як зазначав @FabianBlechschmidt, де знаходиться у виділенні, звідки випливає ваша конкретна проблема, оскільки він не клонується, коли об’єкт колекції клонований, і обидва в кінцевому підсумку посилаються на один і той же екземпляр виділеного об'єкта.
davidalger

Дякуємо за оновлення Я не пробував цього, оскільки вже отримав рішення, якесь таке.
MagExt

Насправді, якщо є питання щодо клонування колекції, серіалізація та несеріалізація може бути корисною у цьому процесі. Існують також інші альтернативи клонування в PHP, які є досить пристойними. Але в цілому Девід правильний ... в основному, коли ви клонуєте об'єкт, ви клонуєте покажчики і на вкладені до нього вкладені Об'єкти, хоча його відповідь не належним чином визначає основну проблему.
mprototype

1

Щоб розширити відповідь на @ davidalger, ви можете скинути вибране, якщо ви хочете зробити іншу операцію, ніж підрахунок - так:

$select= $collection->getSelectCountSql()->reset();

$select
    ->from('newsletter_subscriber', array('some_column'))
    ->distinct();

Але будьте обережні, це може мати згубний вплив пізніше в процесі, оскільки це модифікує колекцію.

Кращим способом було б клонування вибору якось, але мілка копія не вирізала б його, оскільки об'єкт містить складні типи (у методу Varien_Db_Select ні Zend_Db_Select є __cloneметод).

Один із способів обійти це - зберегти вибрані дані, змінити їх, запустити запит, а потім повернути вихідні дані вибору.

Дивіться тут приклад: https://ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.