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

製品までのレベルの制限が設定されている場合は、1回限りのクエリを作成して、PHPでの処理時間を節約できます。エイリアスを使用して同じテーブルに必要な数の結合を追加することにより、手動で「再帰」を実行できます。

現在のスキーマを強制的に使用する場合は、クエリを再構築する必要はなく、空であるかどうかを確認するために、クエリを実行してアクティブレコードに抽象化する必要がない場合があります。

これは、メニュー構造が無限に深くないことを前提としています。

于 2012-04-18T15:20:09.833 に答える