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;
}

...
}
4

2 回答 2

2

递归是数据库真正不擅长的(例如MySql 根本不支持递归)。不幸的是,您所要求的无法直接实现。

您的选择是:

  1. 在 PHP 中进行过滤。
  2. 修改您的数据库模式以使用修改后的预排序树遍历(MPTT),更新您的模型并再次询问。
于 2012-04-18T11:47:19.067 回答
0

如果您对产品设置了级别限制,那么您可以构建一次性查询以节省 PHP 处理时间。您可以通过使用别名将所需数量的连接添加回同一个表来手动执行“递归”。

如果您被迫进入当前模式,那么这可能避免必须重建查询,更不用说执行并将其抽象回 Active Records 以查看它们是否为空。

这是假设您没有无限深的菜单结构。

于 2012-04-18T15:20:09.833 回答