Pregunta

Tengo una colección en un método donde quiero realizar dos operaciones diferentes en esta colección. Por lo tanto, quiero dos copias separadas de esta misma colección, y luego asignar uno de los dos colecciones a la colección original de nuevo y volver a él.

Para hacer este sencillo, supongamos que tengo una colección de objetos llamada $collection.

Ahora, estoy tratando con PHP clonación, ya que no sé si hay alguna Magento incorporado colección de clonación o no.

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

Ahora estoy tratando de realizar diferentes operaciones sobre estos dos clones independientes de la colección original, algo así.

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

Pero lo raro es que, tanto en estas colecciones clonados tienen tanto el que las condiciones asignado! $ Coll1 condición se aplica a $ coll2 junto con la condición de $ coll2, y viceversa.

¿Alguien sabe cómo lograr esto?

Gracias!

¿Fue útil?

Solución

El uso del operador clon PHP, cuando se desea la clonación profundo, requiere clases que almacenan objetos en las propiedades implementan un método __clone para copiar los objetos. Si no lo definen, las propiedades en ambos casos se hacer referencia al mismo objeto.

Magento no implementa __clone en él de los resúmenes de recogida, y por lo tanto no admite la clonación profundamente como usted desea.

Mi sugerencia es que buscar otras maneras de lograr lo que están queriendo hacer, como la clonación de una colección podría ser bastante caro.

El ejemplo que dio (por ejemplo) podría ser cambiado para clonar la selección, modificarlo para seleccionar un recuento de los registros que habría en carga y en base a ese resultado modificar la colección. Esto también tendrá un mejor rendimiento ya que no estaría cargando una colección y contando sólo para determinar cuál de ellos utilizar.

EDIT:. Lo siguiente demuestra cómo agarrar un recuento sin carga o modificar realmente la colección

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

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

Otros consejos

Para ampliar la respuesta de @ davidalger, puede Restablecer al seleccionar si desea realizar una operación diferente que un recuento - de esta manera:

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

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

Tenga cuidado sin embargo, esto podría tener efectos perjudiciales más adelante en el proceso, ya que esto modifica la colección.

Una mejor manera sería clonar el seleccione alguna manera, pero una copia superficial no lo cortaría ya que el objeto contiene tipos complejos (Varien_Db_Select ni Zend_Db_Select tienen un método __clone).

Una forma de evitar esto es para guardar los datos seleccionados, modificarlo, ejecute la consulta, a continuación, poner de nuevo los datos de selección de originales.

Vea aquí para ver un ejemplo: https: // ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top