mhaupt が述べたように、ループ内の各カテゴリよりもコレクションをロードする方が高速です。しかし、私に関する限り、子カテゴリを手動でロードする必要はありません。基本的に、これは$category->getChildrenCategories()
すでに行っていることです。
アクティブなカテゴリのみを取得するフィルターもあります。addIsActiveFilter()
コレクションを呼び出すだけです。
a.) アクティブな子カテゴリを次の方法でロードしますgetChildren()
// 1. Get a list of all child category ids (e.g "12,23,11,42")
$subcategoryIds = $category->getChildren();
// 2. Create collection
$categoryCollection = Mage::getModel('catalog/category')->getCollection();
// 3. Add all attributes to select, otherwise you can not
// access things like $cat->getName() etc.
$categoryCollection->addAttributeToSelect('*');
// 4. Filter by ids
$categoryCollection->addIdFilter($subcategoryIds);
// 5. Add filter to collection to get active categories only
$categoryCollection->addIsActiveFilter();
b.) アクティブな子カテゴリをロードgetChildrenCategories()
// 1. Load collection
$categoryCollection= $category->getChildrenCategories();
// 2. Add filter to collection to get active categories only
$categoryCollection->addIsActiveFilter();
コレクションは、アクセスされるとすぐにデータベースからロードされます。コレクションがロードされ$subcategories->count()
ずに呼び出された場合、データベースに対して「SELECT count(*)」のみが実行されます (これとは対照的にcount($subcategories)
、コレクション自体が強制的にロードされます)。
コレクションの反復
foreach($categoryCollection as $category) {
echo $category->getName();
}
コレクションにアクセスした後にコレクションにさらにフィルターを追加すると、コレクションは自動的に再ロードされません。コレクションに変更を適用するには、呼び出し$categoryCollection->load()
てデータベースからコレクションをリロードするだけです。