2011-11-09 28 views
6

カテゴリと呼ばれるテーブルがあります。表には、...カテゴリとそのサブ(subsub)カテゴリを保持しているcakephpで自己参照(parent_id)モデルを実装する方法

その簡単テーブル:

  • ID
  • PARENT_ID
  • タイトル

私はカテゴリーを作ることができますこの方法無限の深さで...私はちょっとcakephpがparent_idを理解することを望んでいました(私もcategory_idを試しましたが、それはcakePHP自身に参加します:D)

これに取り組む正しい方法は何ですか?

注:場所と呼ばれる「多対多」表もあります。これらの場所は、1つ以上のカテゴリに属する​​ことができます。 Categoryモデルで

答えて

18

この状況では、ツリーの動作が過剰です。あなたがカテゴリに()検索を行う際に、あなたは(二つの追加モデルと呼ばれる(親IDを指す)親と子供を得るでしょう、

class Category extends AppModel { 

    public $hasMany = array(
    'Children'=>array(
     'className'=>'Category', 
     'foreignKey'=>'parent_id' 
    ) 
); 

    public $belongsTo = array(
    'Parent'=>array(
     'className'=>'Category', 
     'foreignKey'=>'parent_id' 
    ) 
); 

} 

を今:あなたはこのようなあなたのモデルを設定する必要がありますそれは子供のリストです)。

+0

ちょっとリチャード、私は木の行動を探していたが、それは過労かもしれないと私は同意する。いずれかの方法。これを指摘してくれてありがとう! –

2

:belongsToの親とhasManyの子供たちは、両方のは、クラス「カテゴリー」と外部キー「PARENT_ID」tree behaviour

5

顔をしています。 MPTTロジック。オラクルのWebサイトに提供されたリンクは死んでいます。あなたはcake manualonlineでそれを使用する方法についての資料の束を見つけることができます。

CREATE TABLE categories (
    id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    parent_id INTEGER(10) DEFAULT NULL, 
    lft INTEGER(10) DEFAULT NULL, 
    rght INTEGER(10) DEFAULT NULL, 
    name VARCHAR(255) DEFAULT '', 
    PRIMARY KEY (id) 
); 

あなたのテーブルがその構造にマッチして、ケーキ内で最良の結果が得られ、ベーキングしていることを確認してください。

+0

感謝の男、面白い、と働きました。すべてがスムーズにセットアップされています! –

+0

多くの場合、これは過剰です。下記のAnh Phamが適切な関連付けを行っている簡単な自己参照テーブルは、大半の原因で十分です。ツリーの振る舞いは、「深さ」のレベルがレベルを超えている(つまり、子供が子供を持つことができる)ほどますます有用になります。 – pimbrouwers

0

関連する質問 - 私は、@ RichardAtHomeのアドバイスで実装された3レベルの自己参照階層を想定しています。特定のカテゴリを見つけようとすると、親カテゴリとすべての子カテゴリも取得されます。しかし、私はどのようにルートに戻ってパスを見つけることができますか?これを達成するためのクリーンなトリックはありますか、カスタムハックが必要ですか?

Productテーブルに1つのカテゴリIDが関連付けられているシナリオでこれを使用すると思いますが、ユーザーに表示するときに、親チェーン全体を表示して「菓子/季節/ネスレ」 ' - その後、ユーザーが製品全体の階層を変更することができ

1

custom recursive function tree()は私のために私が必要まさに確か

public function index() { 
    $c = $this->tree(); 
    debug($c); 
    exit; 
} 


function tree($parent=null){ 
    $arr = array(); 
    $categories = $this->Category->find('all',array(
     'conditions'=>array('Category.parent_id '=> $parent) 
    )); 
    foreach($categories as $key => $category){   
     $arr[$category['Category']['id']]['title'] = $category['Category']['name'];    
     $arr[$category["Category"]["id"]]['children'] = $this->tree($category['Category']['id']); 
    } 
    return $arr; 
} 
関連する問題