Php 仅选择具有相关模型的模型或具有相关模型的子体

Php 仅选择具有相关模型的模型或具有相关模型的子体,php,sql,activerecord,yii,Php,Sql,Activerecord,Yii,因此,有类别和产品,我需要选择不为空的类别来构建产品类别菜单。 非空表示类别包含产品或子类别包含产品。我想用示波器来做,但我似乎走不了多远 类似于下面的内容,但我需要递归地检查类别层次结构中的更多级别 /** * This is the model class for table "shopCategories". * * The followings are the available columns in table 'shop_categories': * @property in

因此,有类别和产品,我需要选择不为空的类别来构建产品类别菜单。 非空表示类别包含产品或子类别包含产品。我想用示波器来做,但我似乎走不了多远

类似于下面的内容,但我需要递归地检查类别层次结构中的更多级别

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

...
}

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

你的选择是:

  • 用PHP进行过滤
  • 修改要使用的数据库模式(MPTT),更新模型并再次询问

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

    如果您被迫进入当前模式,那么这可能避免了必须重新生成查询,更不用说执行并将其抽象回活动记录中,以查看它们是否为空


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

    在框架抽象之下,如果你不熟悉yii,你就看不到sql问题。我猜是这样的,如果我想对一组只能深入到3个级别的类别进行查询,我可以这样做,但只能为每个级别编写整个显式查询?看起来很糟糕…@dimvic:因为你的模式不适合这样使用。在你看来,我只是用PHP来做。我不打算以任何方式使用它,但我现在“被迫”这样做。。。谢谢你的反馈,我确实有,最多3级,我已经在分类表上有了一个“isActive”列。最后,我做了一个脚本,每隔一段时间运行一次,它会遍历类别,并考虑用户所需的状态以及类别是否为空,将isActive boolean字段重新计算为true或false