2009-10-21 17 views
7

CakePHPでは、モデル内のサブツリーをどれだけ選択するのですかactsAsツリー?CakePHPツリーでサブツリーを見つける

は私がlabel = "My Label"

$this->find("threaded", array(
    "conditions" => array(
     "label" => "My Label" 
    ) 
)); 

でアイテムが率いる木を見つけるために、これを試してみました...しかし、ログを見て、それがこのSQLを実行します:

明らかにのみ選択
SELECT Menu.id, Menu.parent_id, Menu.lft, Menu.rght, Menu.label, Menu.link 
FROM menus Menu 
WHERE label = 'My Label' 

1つのノードであり、すべての子ノードではありません。

答えて

15

あなたが(the manualから)このような二つのステップでそれを行う必要がありますようだ:

$parent = $this->Category->find('first', array(
    'conditions' => array('label' => 'My label') 
)); 
$parentAndChildren = $this->Category->find('threaded', array(
    'conditions' => array(
     'Category.lft >=' => $parent['Category']['lft'], 
     'Category.rght <=' => $parent['Category']['rght'] 
    ) 
)); 

それが唯一の一致する結果を見つけるだろうので、あなたは、threaded呼び出しで'label' => 'my label'条件を使用することはできませんその条件、両親と子供。 はparent_idに基づいて通常の検索操作の結果のみを並べ替えますので、lft/rghtの列を使用して、「子」の条件を指定する必要があります。

+0

ええ、私はまったく同じことをやっていました。この機能をコンポーネントに含めなかったのは面白いようです。 – nickf

+0

私は同意するが、明らかなユースケースのようだ。 ' - > children()'はありますが、 ' - > childrenThreaded()'はありません。モデルクラスのポーズ私はあなたがおそらくidで行くなら '$ model - > _ findThreaded( 'after'、null、$ model-> children($ id))'を実行できると思っていますが、ちょっとハッキリです。 :o) – deceze

+1

答えがありがとう、私はまたこれよりも簡潔な方法を望んでいた。ところで、子供だけが必要な場合は、 '' conditions '=> array(' Category.lft '' => $ parent ['Category'] '' '' '' '' '' Category.rght <' => $ parent [ 'Category'] ['rght']) '親を再度フェッチしないでください。 – bfncs

関連する問題