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

ここで、SQLの質問ですか? –

+0

フレームワークの抽象化の下で、yiiに慣れていない場合はSQLの問題を「見る」ことができません。 – dimvic

答えて

2

再帰が何かのデータベースが本当に得意ではありません(たとえば、MySQLがすべてで再帰をサポートしていません) 。残念ながら、あなたが求めるものは直接には不可能です。

あなたのオプションは以下のとおりです。

  1. は、PHPでのフィルタリングを行います。
  2. modified preorder tree traversal(MPTT)を使用するようにデータベーススキーマを変更し、モデルを更新してもう一度お問い合わせください。
+0

だと思います.3レベルまでしか深くできないカテゴリすべてのレベルの明示的なクエリ全体を書くことによってのみ行うのですか?外見が悪い... – dimvic

+0

@dimvic:あなたが持っているスキーマは、このように使うつもりはないので。あなたの靴では、私はPHPでそれをやるだけです。 – Jon

+0

私はこれをこのように使うつもりはありませんでしたが、今私はこれを "強制"しています...あなたのフィードバックに感謝します – dimvic

0

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

あなたの現在のスキーマを強制すると、クエリが再作成されて実行されず、アクティブレコードに戻ってそれらが空であるかどうかを確認する必要がなくなります。

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

+0

私は実際には、3レベルの最大値を持っています。カテゴリテーブルのisActiveカラム。私が最後にしたのは、カテゴリを通過するスクリプトを作成し、isActiveブール値フィールドをtrueまたはfalseに再計算するスクリプトを作成することでした。ユーザーの希望する状態とカテゴリが空であるかどうかを考慮します – dimvic

関連する問題