Cómo obtener el primer artículo de la colección de productos

23

En la categoría view.phtml si obtengo la categoría y luego obtengo una colección de productos, ¿cómo puedo obtener el primer producto de la colección asignada a $ _product para usar en el código? Esto es lo que tengo:

$_category   = $this->getCurrentCategory();
$_collection = $_category->getProductCollection();
$_product    = 
$_resource   = $_product->getResource();

Intenté usar foreach pero seguí recibiendo errores.

danny
fuente
2
$_product = $_collection->getFirstItem()
pzirkind
1
@pzirkind puso esta respuesta. Por favor, no lo ponga comentario
Amit Bera
1
Intenté esto pero obtengo un error: método no válido Mage_Catalog_Block_Category_View :: canEmailToFriend (Array))
danny
1
@heisenberg que yo y tú estamos tratando de llamar a una función que no existe, de cualquier manera, es un error diferente (no está conectado con tu pregunta original), actualiza tu pregunta con el nuevo código o comienza uno nuevo
pzirkind
@danny si encontró una respuesta aquí, acepte marcar esta pregunta como resuelta.
sv3n

Respuestas:

25

Para obtener el primer elemento de una colección, simplemente use la getFirstItem()función en la colección.

Ejemplo:

// this gets all the products
$productCollection = Mage::getResourceModel('catalog/products_collection');
// this line gets just the first product
$firstItem = $productCollection->getFirstItem(); 

Ejemplo 2 (para esta pregunta en particular):

$_category  = $this->getCurrentCategory();
$_collection = $_category->getProductCollection();
$_product =  $_collection->getFirstItem(); // this will get first item in collection

Algunas otras áreas se pueden usar:

Clientes

$customerCollection = Mage::getResourceModel('customer/customer_collection');
$firstCustomer = $customerCollection->getFirstItem();

Pedidos

$orderCollection = Mage::getResourceModel('sales/order_collection');
$firstOrder = $orderCollection->getFirstItem();

Tenga en cuenta:

No es una buena idea cargar TODOS los productos / clientes / pedidos, ya que esto requiere muchos recursos. La forma preferida es limitar lo que desea cargar utilizando las funciones addAttributeToFilter()o addFieldToFilter(), consulte el siguiente ejemplo:

$productCollection = Mage::getResourceModel('catalog/product_collection')
                           ->addAttributeToFilter('sku', 'book123`);
pzirkind
fuente
5

pzirkind es totalmente correcto, solo me pregunto si a nadie le importa el rendimiento. Si SOLO desea el primer / último elemento de una colección, siempre debe limitar su consulta a 1:

$collection->getSelect()->limit(1);

El solo uso getFirstItem()seguirá cargando toda la colección y luego tomará el primer elemento.


Ejemplo : categoría con 750 productos.

$category = Mage::getModel('catalog/category')->load(41);
$collection = $category->getProductCollection();
# $collection->getSelect()->limit(1);
var_dump($collection->getSelect()->__toString());
var_dump($collection->getFirstItem()->getData());

Solo getFirstItem():

  • Total incl. Tiempo de pared (microsec): 2,318,497 microsecs
  • Total incl. CPU (microsecs): 2,000,604 microsecs
  • Total incl. MemUse (bytes): 7,729,776 bytes
  • Total incl. PeakMemUse (bytes): 7,977,672 bytes
  • Número de llamadas a funciones: 96,957

Agregando getSelect()->limit(1):

  • Total incl. Tiempo de pared (microsec): 424,955 microsecs
  • Total incl. CPU (microsecs): 380,326 microsecs
  • Total incl. MemUse (bytes): 4,043,728 bytes
  • Total incl. PeakMemUse (bytes): 3,976,000 bytes
  • Número de llamadas a funciones: 15,249
sv3n
fuente
2
Esto es ideal ya que cubre dos soluciones, proporciona tiempos de ejecución y explica los beneficios de rendimiento +1
BENN1TH
3
var_dump($_collection->getFirstItem()->getData());
echo $_collection->getFirstItem()->getName();

También cómo obtener el último artículo:

echo $_collection->getLastItem()->getName();
var_dump($_collection->getLastItem()->getData()); 
TBI Infotech
fuente
2

@pZirKind tiene razón, puede obtener el primer elemento de la colección de productos utilizando los métodos nativos de la clase Varien Collection, como:

$_category  = $this->getCurrentCategory();

$_collection = $_category->getProductCollection();

$_product = $_collection->getFirstItem()
sandip.vaghasiya
fuente
0
$Collection = Mage::getResourceModel('catalog/products_collection');
$firstItem = $Collection->getFirstItem(); 
Sheshgiri Anvekar
fuente
0

Prueba esto por favor

    $_category  = $this->getCurrentCategory();        
    $_collection = $_category->getProductCollection();        
    $_items = $_productCollection->getItems(); 
   if($_items){  
    $_items[0]->getShortName();
    $_items[0]->getProductUrl();
   }
Vivacity InfoTech Pvt. Limitado.
fuente