Magento Collection, как получить массив значений определенного поля

Начиная с коллекции, мне нужно получить массив значений определенного поля. Позвольте мне вызвать это поле my_id.

Для этого я использую Varien_Data_Collection::setDataToAll() в моей коллекции.. следующим образом:

$collection_fields_array = $collection->setDataToAll(array('my_id'))->toArray(array('my_id'));

.. Я получаю что-то вроде этого:

Array
(
    [0] => Array
        (
            [my_id] => 71e1bd18
        )

    [1] => Array
        (
            [my_id] => 70d47a69
        )

    [2] => Array
        (
            [my_id] => 687bed84
        )

    [3] => Array
        (
            [my_id] => 673df159
        )

    [4] => Array
        (
            [my_id] => 66690a4c
        )

    [5] => Array
        (
            [my_id] => 65994440
        )
)

Но.. если моя коллекция содержит большое количество элементов. setDataToAll() становится слишком трудоемким и, наконец, сбрасывает все память 2Gb (!!!)... это потому, что итерация между всеми элементами.

Другой способ получить массив значений полей без этого обхода?

Ответ 1

В этом случае вы можете использовать getColumnValues('fieldName').

Итак, попробуйте это

$collection->getColumnValues('my_id')

Ответ 2

Я не был в вашей конкретной ситуации, но у меня были схожие проблемы, когда я хотел выполнить действие для всех заказов на моем сайте - объекты большие, и если бы я просто сделал коллекцию всех заказов, он быстро заполнит доступную память и умрет.

В моем случае я работал с заказами, поэтому начал цикл и только один месяц за раз за один раз - немного дополнительного кода, но он сделал размер коллекции более управляемым. Не могли бы вы сделать что-то подобное здесь?

Например, если они являются продуктами, возможно, фильтровать на product_id и делать только 1000 за раз, или для заказов дата имеет тенденцию работать хорошо, если они распределены несколько равномерно и так далее. Просто какое-то поле, которое (разумно) равномерно делит их.