質問

このコレクションで2つの異なる操作を実行したい方法に1つのコレクションがあります。そのため、同じコレクションの2つの個別のコピーが必要で、2つのコレクションのいずれかをオリジナルコレクションに再度割り当てて返送します。

これをシンプルにするために、私が呼ばれるオブジェクトコレクションを持っていると仮定します $collection.

今、私はPHPクローニングでそれを試しています。なぜなら、Magento Collection Cloningが組み込まれているかどうかはわかりません。

$coll1 = clone $collection;
$coll2 = clone $collection;

今、私は元のコレクションのこれら2つの別々のクローンで異なる操作を実行しようとしています。

$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クローン演算子の使用には、プロパティにオブジェクトを保存するクラスが必要です。オブジェクトをコピーするために__クローンメソッドを実装します。それらがそれを定義しない場合、両方のインスタンスのプロパティが同じオブジェクトを参照します。

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 方法)。

これを回避する1つの方法は、選択したデータを保存し、変更し、クエリを実行してから、元の選択データを元に戻すことです。

例については、こちらをご覧ください。https://ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top