2012-04-18 130 views
2

因此,有類別和產品,我需要選擇不是爲了打造的產品類別菜單爲空的類別。 不爲空意味着該類別包含產品或包含產品的後代類別。我想用範圍來做,但我似乎無法走得更遠。與相關模型或後代只選擇模型具有相關車型

東西有點像下面,但我需要遞歸查詢更多水平下降的類別層次

/** 
* This is the model class for table "shopCategories". 
* 
* The followings are the available columns in table 'shop_categories': 
* @property integer $id 
* @property integer $parentId 
* @property integer $order 
* @property integer $isActive 
* @property integer $cstamp 
* @property integer $mstamp 
* 
* The followings are the available model relations: 
* @property ProductCategory $parent 
* @property ProductCategory[] $children 
* @property ProductCategoryL10n[] $l10n 
* @property ProductCategoriesProducts[] $productsJunction 
*/ 
class ProductCategory extends BogoActiveRecord 
{ 
... 

public function nonEmpty() 
{  
    $this->getDbCriteria()->mergeWith(array(
     'with' => array(
      'children', 
      'children.products'=>array(
       'condition'=>'products.isActive=1', 
       'joinType'=>'INNER JOIN', 'limit'=>1 
      ), 
     ), 
    )); 

    return $this; 
} 

... 
} 
+0

問題在哪裏? – 2012-04-18 11:44:17

+0

框架下的抽象,你不能「看到」如果你不熟悉的警予SQL問題我想 – dimvic 2012-04-18 12:00:15

回答

2

遞歸是什麼數據庫是真的不擅長(如MySQL不支持遞歸在所有) 。不幸的是,你要求的是不可能的。

的選項有:

  1. 執行濾波PHP。
  2. 修改數據庫模式使用modified preorder tree traversal(MPTT),更新模型和再問。
+0

所以,如果我想這樣做對一組類別只能去深達3級,我可以這樣做,但只能通過編寫每個級別的整個顯式查詢?看起來很糟糕...... – dimvic 2012-04-18 12:01:39

+0

@dimvic:因爲你擁有的模式並不意味着要這樣使用。在你的鞋子裏,我只是用PHP做的。 – Jon 2012-04-18 12:24:35

+0

我不打算以任何方式使用這樣的,但我「被迫」現在做到這一點...感謝您的反饋 – dimvic 2012-04-18 13:04:00

0

如果您對產品有一個限定的級別,那麼您可以構建一次性查詢以節省PHP處理時間。您可以手動執行「遞歸」,方法是使用別名將同樣多的連接添加回同一個表。

如果強行到當前的模式那麼這可能避免必須重建查詢更不用說執行和抽象它放回活動記錄只是爲了看看他們是空的。

這是假設你沒有一個無限深的菜單結構。

+0

我其實也有,3個級別最大的,我已經有了一個「類別表中的「isActive」列。我最終做的是讓腳本在一段時間內運行一遍,通過類別重新計算,將activeLoolean字段重新計算爲true或false,同時考慮到用戶所需的狀態以及類別是否爲空或不是 – dimvic 2012-04-18 17:44:52