13

从一个集合开始,我需要获取一个特定字段的值数组......让我称之为这个字段my_id

为此,我Varien_Data_Collection::setDataToAll()在我的 Collection.. 上以这种方式使用:

$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(!!!) 内存...这是因为它在所有项目之间迭代。

没有这种解决方法,是另一种获取字段值数组的方法吗?

4

2 回答 2

38

在这种情况下,您可以使用getColumnValues('fieldName').

所以,试试这个

$collection->getColumnValues('my_id')

于 2013-06-06T15:38:58.377 回答
0

我没有遇到过你的特殊情况,但是当我想对我网站中的所有订单执行操作时,我遇到了类似的问题 - 对象很大,如果我只是收集所有订单,它会很快填满可用内存然后死掉。

就我而言,我正在处理订单,所以我开始循环并一次只选择一个月的价值 - 一些额外的代码,但它使集合大小更易于管理。你能在这里做类似的事情吗?

例如,如果它们是产品,则可以过滤 product_id 并且一次只执行 1,000 个,或者对于订单,如果它们分布得比较均匀,则日期往往会很好,等等。只是一些(合理地)将它们平均划分的字段。

于 2013-06-06T14:37:47.090 回答