从Collection开始,我需要获取特定字段的值数组。我将此字段称为my_id
。
要做到这一点,我会以这种方式使用我的Collection上的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
)
)
但是..如果我的Collection包含大量项目.. setDataToAll()
变得太耗时并最终崩溃所有2Gb(!!!)的内存......这是因为它在所有项目之间进行迭代。
获取字段值数组的另一种方法是不使用此解决方法吗?
答案 0 :(得分:34)
在这种情况下,您可以使用 getColumnValues('fieldName')
。
所以,试试这个
$collection->getColumnValues('my_id')
答案 1 :(得分:0)
我没有遇到过你的特殊情况,但是当我想对我网站上的所有订单执行操作时,我遇到了类似的问题 - 对象很大,如果我只收集了所有订单,它会很快填满可用的内存并死掉。
在我的情况下,我正在处理订单,所以我开始循环,一次只选择一个月的价值 - 一点额外的代码,但它使集合大小更易于管理。你能在这里做类似的事吗?
例如,如果它们是产品,可能会在product_id上进行过滤,一次只能进行1,000次,或者对于订单,如果日期分布均匀,则日期往往效果很好,等等。只是某些领域(合理地)将它们平分。