2013-06-28 91 views
0

我試圖加載與產品關聯的所有類別,但只應選擇最深的子類別。例如,產品與類別women > trousers > jeans相關聯,只有jeans應該可見。獲取產品最低級別的子類別

我想出了到目前爲止的代碼返回正確的查詢,但訪問該集合SQL錯誤被拋出時:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'cat_path' in 'on clause'

/* @var $_categoryNames Mage_Catalog_Model_Resource_Category_Collection */ 
$_categoryNames = $_product->getCategoryCollection(); 

$_categoryNames 
    ->joinTable(
     'catalog/category', 
     "entity_id = entity_id", 
     array('cat_path' => 'path') 
    ) 
    ->getSelect() 
    ->where(
     "cat_path not like(CONCAT(path, '/%'))" 
    ); 

die($_categoryNames->getSelect()); 

UPDATE: 感謝blmage我至少能找到一個SQL語句,以獲得正確類別:

SELECT * 
FROM `catalog_category_entity`e 
WHERE (SELECT COUNT(`entity_id`) 
FROM `catalog_category_entity`c 
WHERE c.path LIKE (CONCAT(e.path,'%')) 
)=1 
+0

不能在'WHERE'子句中使用字段別名,和您的查詢將不能工作,因爲'cat_path'實際上是'path'(你在自己參加一個類別)。另外,你應該在字符串上使用'CONCAT'而不是'+'。無論如何,你爲什麼不過濾PHP中的集合? – blmage

+0

感謝您的意見。我想在sql中這樣做,因爲它需要爲每個產品加載,我認爲這樣會更快。你是對的,現在我正在爲自己的類別加入。嘗試使用' - > getSelect() - > join()'。我試圖重現生成至少一個工作查詢的代碼。 –

回答

1

我的解決方案現在使用子選擇而不是連接。可能還有些東西需要改進,但對我來說很有用。

$_categoryIds = $_product->getCategoryIds(); 


/** @var $read Varien_Db_Adapter_Interface */ 
$read = Mage::getSingleton('core/resource') 
    ->getConnection('core_read'); 

$_categoryIdSelect=$read->select() 
    ->from(
     array(
      'c' => $_categories->getTable('catalog/category') 
     ), 
     'COUNT(e.entity_id)' 
    ) 
    ->where('entity_id IN (?)', $_categoryIds) 
    ->where(
     "c.path LIKE (CONCAT(e.path,'%'))" 
    ); 

/* @var $_categoryNames Mage_Catalog_Model_Resource_Category_Collection */ 
$_categoryNames = $_product->getCategoryCollection();  
$_categoryNames->getSelect() 
      ->where(
       '2 > (?)', 
       new Zend_Db_Expr($_categoryIdSelect) 
      ); 
0

試試這個

$path = "/abc/example"; 

$_categoryNames->addFieldToFilter('cat_path', array('nlike' => $path)); 
+0

謝謝,但我需要比較每個'cat_path'到所有'路徑'。我認爲這不能通過過濾器來實現。 –

相關問題