製品コレクションから最初のアイテムを取得する方法


23

カテゴリview.phtmlでカテゴリを取得してから製品コレクションを取得した場合、コードで使用するために$ _productに割り当てられたコレクションから最初の製品を取得するにはどうすればよいですか?ここに私が持っているものがあります:

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

foreachを使用しようとしましたが、エラーが発生し続けました。


2
$_product = $_collection->getFirstItem()
pzirkind 14年

1
@pzirkindこのanswer.pleaseを置くことは、それがコメント入れていない
アミットベラ

1
私はこれを試しましたが、エラーが発生しました-無効なメソッドMage_Catalog_Block_Category_View :: canEmailToFriend(Array))
ダニー14年

1
@heisenbergは、元の質問とは関係なく、別のエラーが発生しない関数を呼び出そうとしていることを意味します。新しいコードで質問を更新するか、新しいコードを開始します
pzirkind

ここで答えを見つけた場合は、@ dannyを受け入れて、この質問を解決済みとしてマークしてください。
sv3n

回答:


25

コレクションの最初のアイテムを取得するには、コレクションのgetFirstItem()関数を使用します。

例:

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

例2(この特定の質問の場合):

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

これを使用できる他のいくつかの領域:

お客さま

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

ご注文

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

ご注意ください:

このためにすべての製品/顧客/注文をロードすることはお勧めできませんが、多くのリソースが必要です。望ましい方法は、addAttributeToFilter()or addFieldToFilter()関数を使用してロードするものを制限することです。以下の例を参照してください。

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

5

pzirkindは完全に正しいです。パフォーマンスについてはだれも気にかけないと思っているだけです。コレクションの最初/最後のアイテムのみが必要な場合は、クエリを常に次のように制限する必要あります1

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

使用getFirstItem()するだけでコレクション全体ロードされ、その後最初のアイテムが取得されます。


:750の製品があるカテゴリ

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

ただgetFirstItem()

  • 合計を含む ウォールタイム(マイクロ秒):2,318,497マイクロ秒
  • 合計を含む CPU(マイクロ秒):2,000,604マイクロ秒
  • 合計を含む MemUse(バイト):7,729,776バイト
  • 合計を含む PeakMemUse(バイト):7,977,672バイト
  • 関数呼び出しの数:96,957

追加getSelect()->limit(1)

  • 合計を含む ウォールタイム(マイクロ秒):424,955マイクロ秒
  • 合計を含む CPU(マイクロ秒):380,326マイクロ秒
  • 合計を含む MemUse(バイト):4,043,728バイト
  • 合計を含む PeakMemUse(バイト):3,976,000バイト
  • 関数呼び出しの数:15,249

2
これは2つのソリューションをカバーし、実行時間を提供し、パフォーマンスの利点を説明するので理想的です+1
BENN1TH

3
var_dump($_collection->getFirstItem()->getData());
echo $_collection->getFirstItem()->getName();

最後のアイテムを取得する方法:

echo $_collection->getLastItem()->getName();
var_dump($_collection->getLastItem()->getData()); 

2

@pZirKindは、次のようなVarien Collectionクラスのネイティブメソッドを使用して、製品コレクションから最初のアイテムを取得できます。

$_category  = $this->getCurrentCategory();

$_collection = $_category->getProductCollection();

$_product = $_collection->getFirstItem()


0

これを試してください

    $_category  = $this->getCurrentCategory();        
    $_collection = $_category->getProductCollection();        
    $_items = $_productCollection->getItems(); 
   if($_items){  
    $_items[0]->getShortName();
    $_items[0]->getProductUrl();
   }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.