2012-04-18 106 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