cakePHP 2.0 find( 'threaded')問題

私は自分のジョブコントローラで以下を実行しています。

$this->set('jobs', $this->Job->find('threaded', array('conditions' => array('Job.id' => 20))));

今私の見解では、 $ jobs を私の foreach ループに表示していますが、問題はparent_idフィールドを使ってJob.idにリンクされた子を持っています。私は配列内の子供を見ることができるので、リンクが正常に動作することを知っています。

    Array
(
[0] => Array
    (
        [Job] => Array
            (
                [id] => 20
                [parent_id] => 0
                [rght] => 2
                [lft] => 1
                [client_id] => tasd
                [contact] => asdf
                [email] => sdf
                [address] => 
                [lat] => 
                [long] => 
                [user_id] => 1
                [request_type_id] => Electrical
                [date_start] => 0000-00-00 00:00:00
                [date_end] => 0000-00-00 00:00:00
                [date_complete] => 0000-00-00 00:00:00
                [date_closed] => 0000-00-00 00:00:00
                [status] => completed
                [brief_desc] => aasdf
                [desc] => asdfasdf
                [cost_est] => 3434.00
                [cost_actual] => 
                [created] => 2011-12-18 20:39:24
                    [modified] => 2011-12-18 20:39:24
            )


        [Children] => Array
            (
                [0] => Array
                    (
                        [id] => 21
                        [parent_id] => 20

私は親ジョブの下に子ジョブを表示したいと思います。どのようにネストされたコメントが正しく機能するかどんな助けも素晴らしいだろう。

2

3 答え

find( 'threaded')が生成しているSQLを見てください。あなたは20のidを持つすべてのJobsを求めています(Job 20の子であるすべてのJobsではなく)

lftフィールドとrghtフィールドがあるので、Treeの動作が添付されていると仮定します。つまり、 children()を使用できます。

$this->Job->id = 20;
$this->Job->children();

しかし、これはネストされた配列ではなくフラットな配列を提供します。ネストした配列が必要な場合は、 find( 'threaded')呼び出しでlft列とrght列を使用します。

$parentJob = $this->Job->find('first', array(
    'conditions' => array(
        'Job.id' => 20
    )
);

$children = $this->Job->find('first', array(
    'conditions' => array(
        'Job.lft BETWEEN ? AND ?' => array($parentJob['Job']['lft'], $parentJob['Job'])['rght']
    )
);

もちろん、あなたはそれを単一のクエリにすることができますが、私はそれを「読者のための練習として」残します(私は教科書の作家であったはずです)

6
追加された
ありがとうダコタ、私は今戻っている配列は、私が使用する必要がある配列のように見えるようです。この配列を読み込むのに使う最高のPHPコードは何ですか?私が使用している通常のforeach文はまったく動作していません。
追加された 著者 AshHimself,
この回答は良いですが、私はこれが古いことを知っていますが、括弧はステートメントを閉じるには不十分です。そして、私は、2番目の発見は '最初の'
追加された 著者 Joshua Foxworth,
再帰関数(理想的には)を使う必要があります。 chetan patelが投稿したリンクを見てください。非常に古くなっているかもしれませんが、ヘルパークラスは何をすべきかを知っておくべきです( app/views/helpers/tree.php のページを検索してください)。
追加された 著者 Dakota,

find( 'threaded')の結果をcakephpのビューで表示したい場合は、次のように使用できます。

コントローラコード:

$params = array('recursive' => -1,'fields' => 'Category.id, Category.name, Category.parent_id'); $categories = $this->Category->find('threaded',$params);

あなたのスレッド結果を次のように表示します:

foreach($categories as $category):
        $category_name = $category['Category']['name'];
        foreach($category['children'] as $children):
              $sub_category = $children['Category']['name'];
        endforeach;
endforeach;

私はその結果を表示する適切な方法を知らないが、うまくいきます。 誰かのためにその助けを願って:) 私はcakephpと学習の基礎が新しいです。何か間違いが見つかった場合は、私を許してください。

1
追加された
0
追加された
私はそれを読んだ。その非常に古い記事と私はそれを使用して( 'スレッド')を使用するとは思わない
追加された 著者 AshHimself,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com