Question

J'ai une collection dans une méthode où je veux effectuer deux opérations différentes sur cette collection. Donc, je veux deux exemplaires de même collection, puis attribuez-lui l'une des deux collections à la collection originale de nouveau et de le retourner.

Pour ce simple, supposons que j'ai une collection d'objets appelé $collection.

Maintenant, je suis en train avec le clonage PHP comme je ne sais pas s'il y a un clonage de intégré collection Magento ou non.

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

Maintenant, je suis en train d'effectuer des opérations différentes sur ces deux clones distincts de la collection originale, quelque chose comme.

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

Mais la chose étrange est, ces deux collections clonés ont à la fois les conditions où attribuées! $ Condition COLL1 est appliquée à $ coll2 ainsi que l'état de $ coll2, et vice versa.

Quelqu'un sait comment y parvenir?

Merci!

Était-ce utile?

La solution

L'utilisation de l'opérateur clone PHP, où le clonage profond est souhaitée, nécessite des classes qui stocker des objets sur les propriétés mettent en œuvre une méthode __clone pour copier les objets. Si elles ne définissent pas, les propriétés des deux instances feront référence le même objet.

Magento n'implémente pas __clone sur son résumé de collecte, et donc ne prend pas en charge le clonage profond que vous le souhaitez.

Ma suggestion est de chercher d'autres façons d'accomplir ce que vous voulez faire, comme le clonage d'une collection pourrait être assez cher.

L'exemple que vous avez donné (par exemple) pourrait être modifié pour cloner le sélectionner, le modifier pour sélectionner un nombre d'enregistrements, il aurait chargé, puis en fonction de ce résultat modifier la collection. Cela permettrait également de meilleurs résultats puisque vous ne seriez pas chargez une collection et en comptant juste pour déterminer lequel utiliser.

EDIT:. L'exemple suivant montre comment saisir un nombre sans charger ou modifier réellement la collection

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

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

Autres conseils

Pour développer @ la réponse de davidalger, vous pouvez reset sélectionnez si vous voulez faire une autre opération qu'un nombre - comme ceci:

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

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

Attention cependant, cela pourrait avoir des effets néfastes plus tard dans le processus depuis cette collection modifie la.

Une meilleure façon serait de cloner le sélectionner en quelque sorte, mais une copie peu profonde ne serait pas coupé puisque l'objet contient des types complexes (Varien_Db_Select ni Zend_Db_Select ont une méthode de __clone).

Une façon de contourner ce problème est d'enregistrer les données de sélection, le modifier, exécutez votre requête, puis remettre les données de sélection d'origine.

Voir ici pour un exemple: https: // ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top