我有一个收藏集中的一种方法,我想在此集合上执行两个不同的操作。因此,我想要同一集合的两个单独的副本,然后将两个集合之一分配给原始集合并将其返回。

为了使这个简单,假设我有一个名为的对象集合 $collection.

现在,我正在使用PHP克隆尝试它,因为我不知道是否有任何内置的Magento Collection克隆。

$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,反之亦然。

有人知道如何实现这一目标吗?

谢谢!

有帮助吗?

解决方案

使用需要深克隆的PHP克隆操作员的使用需要将对象存储在属性上的类实现__clone方法来复制对象。如果他们不定定义它,则两种实例上的属性都将引用相同的对象。

Magento不会在其集合摘要上实现__Clone,因此不支持您想要的深克隆。

我的建议是寻找其他方法来完成您想要做的事情,因为克隆一个系列可能非常昂贵。

您给出的示例(例如)可以更改以克隆选择,然后对其进行修改以选择它将加载的记录计数,然后基于该结果修改集合。这也会表现更好,因为您不会加载收藏品并计算它只是为了确定要使用哪一个。

编辑: 以下说明了如何在不加载或实际修改集合的情况下获取计数。

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

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

其他提示

为了扩展 @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-collection-collection-in-magento/

许可以下: CC-BY-SA归因
scroll top