Frage

Ich habe eine Sammlung in einer Methode, bei der ich in dieser Sammlung zwei verschiedene Operationen ausführen möchte. Ich möchte also zwei separate Kopien derselben Sammlung und zuweisen dann erneut eine der beiden Sammlungen der Originalsammlung und geben sie zurück.

Um dies einfach zu machen, nehmen Sie an, ich habe eine Objektsammlung namens namens $collection.

Jetzt versuche ich es mit PHP -Klonen, da ich nicht weiß, ob es eine Magento -Sammlung gibt, die eingebaut ist oder nicht.

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

Jetzt versuche ich, in diesen beiden getrennten Klonen der Originalkollektion verschiedene Operationen auszuführen, so etwas wie.

$coll1->getSelect()->where('some where condition');
$coll2->getSelect()->where('some different where condition');
if($coll1->count() == 0) {
    $collection = $coll2;
} else {
    $collection = $coll1;
}

Aber das seltsame Ding ist, dass beide geklonten Sammlungen beide zugewiesen sind! $ coll1 wird auf $ coll2 zusammen mit dem Zustand von $ coll2 angewendet und umgekehrt.

Weiß jemand, wie man das erreicht?

Vielen Dank!

War es hilfreich?

Lösung

Die Verwendung des PHP -Klonoperators, bei dem tiefes Klonen gewünscht wird, erfordert Klassen, die Objekte auf Eigenschaften speichern, um eine __clone -Methode zu implementieren, um die Objekte zu kopieren. Wenn sie es nicht definieren, verweisen die Eigenschaften in beiden Fällen auf dasselbe Objekt.

Magento implementiert __clone nicht auf die Zusammenfassung der Sammlung und unterstützt daher nicht das Tiefenklonen, wie Sie es möchten.

Mein Vorschlag ist, nach anderen Möglichkeiten zu suchen, um das zu erreichen, was Sie tun möchten, da das Klonen einer Sammlung ziemlich teuer sein könnte.

Das Beispiel, das Sie angegeben haben (z. B.), könnte geändert werden, um die Auswahl zu klonen, diese zu ändern, um eine Anzahl der Datensätze auszuwählen, die sie geladen hätte, und dann basierend auf diesem Ergebnis ändern die Sammlung. Dies würde auch besser abschneiden, da Sie keine Sammlung laden und sie zählen würden, um zu bestimmen, welche Sie verwenden sollen.

BEARBEITEN: Das Folgende zeigt, wie man eine Zählung greift, ohne die Sammlung zu laden oder tatsächlich zu ändern.

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

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

Andere Tipps

Um die Antwort von @Davidalger zu erweitern, können Sie zurücksetzen Die Auswahl, wenn Sie eine andere Operation durchführen möchten als eine Anzahl - wie SO:

$select= $collection->getSelectCountSql()->reset();

$select
    ->from('newsletter_subscriber', array('some_column'))
    ->distinct();

Seien Sie jedoch vorsichtig, dies könnte später im Prozess nachteilige Auswirkungen haben, da dies die Sammlung ändert.

Ein besserer Weg wäre, die Auswahl irgendwie zu klonen, aber eine flache Kopie würde sie nicht kürzen, da das Objekt komplexe Typen enthält (VIVIEN_DB_SELECT oder ZEND_DB_SELEct haben eine __clone Methode).

Eine Möglichkeit, dies zu umgehen, besteht darin, die ausgewählten Daten zu speichern, diese zu ändern, Ihre Abfrage auszuführen und dann die ursprünglichen Auswahldaten zurückzulegen.

Ein Beispiel finden Sie hier:https://ka.lpe.sh/2013/05/23/magento-collection-how-to-collection-in-magento/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top