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处理时间。通过使用别名将所需数量的联接添加回同一个表,可以手动执行“递归” 如果您被迫进入当前模式,那么这可能避免了必须重新生成查询,更不用说执行并将其抽象回活动记录中,以查看它们是否为空
这是假设你没有无限深的菜单结构。在框架抽象之下,如果你不熟悉yii,你就看不到sql问题。我猜是这样的,如果我想对一组只能深入到3个级别的类别进行查询,我可以这样做,但只能为每个级别编写整个显式查询?看起来很糟糕…@dimvic:因为你的模式不适合这样使用。在你看来,我只是用PHP来做。我不打算以任何方式使用它,但我现在“被迫”这样做。。。谢谢你的反馈,我确实有,最多3级,我已经在分类表上有了一个“isActive”列。最后,我做了一个脚本,每隔一段时间运行一次,它会遍历类别,并考虑用户所需的状态以及类别是否为空,将isActive boolean字段重新计算为true或false