2010-12-28 9 views
0

私の最初の質問は、私が孤独な開発者なので、私が問題に悩まされているときにアイデアを得ることができます。その問題を解決するためのサイトはありますか?バーチャルコプログラマーサイトのように?または、StackOverflowはそのように動作できますか?PHP/CodeIgniterの "steps"、 "sub-steps"、 "sub-sub-steps"をループする

私の主な質問:私は "やるべきこと"のようなものに取り組んでいますが、各項目にはサブステップやサブサブステップが含まれている可能性があります。

$i = new Item(); 
$i->where('parent_id',0)->get(); 
foreach($i as $item) { 
    echo $item->item; 
    $si = new Item(); 
    $si->where('parent_id',$item->id)->get(); 
    foreach($si as $subItem) { 
     echo $subItem->item; 
     // and so on 
    } 
} 

それを:私はすべてのトップレベルの項目は、CodeIgniterの中DataMapperのORMを使用してPARENT_ID = 0を持つ、フィールド「ID、項目、PARENT_ID」を持つテーブルを持って、私はこれを使用していますこれを達成するためのスマートな方法がありますか?再帰関数のいくつかの種類かもしれない?

私は他の誰かが管理しているすべてのものを持っているので、移動する必要のあるアイテムをドラッグ&ドロップできるだけですが、それは別の問題です。

答えて

0

Smthはこのようにテストされていません:count($ ss)はクエリから返された結果があるかどうかを確認するために適切な値を返さない可能性がありますので、必要に応じて更新してください(ZendではZend_Db_Table_Rowset独自のSQLを記述する場合に文は)結果は、クエリだから、そこに返された場合にのみ、

function recursive($i) 
    { 
     foreach ($i as $item) 
     { 
      echo $item->item; 
      $si = new Item(); 
      $ss = $si->where('parent_id', $item->id)->get(); 
      if (count($ss) > 0) 
       recursive($ss); 
     } 
    } 
    $i = new Item(); 
    recursive($i->where('parent_id', 0)->get()); 
3

を関数を呼び出す場合SHUREどのオブジェクトCI戻り、あなたは結果の数を数えることができる場合)、更新してくださいあなたはでした 3クエリでこれを行うことができます。

"SELECT * FROM items WHERE parent_id = 0;" 
"SELECT * FROM items WHERE parent_id IN (SELECT id FROM items WHERE parent_id = 0;" 

しかし、あなたが望むように見えるtree-like structureマルチネストされた:

| item | 
    | sub-item | 
    | sub-sub-item | 

あなたはCIを使用している場合は、(私の意見では)自己参照を処理することDoctrineと呼ばれる、より良いORMがあります木のようなデータ構造(あなたが提案したような再帰を使用して)。ありがたいことに、CodeIgniterに組み込むための素敵な記事があります!それも関係してCodeIgniterのが欠けているキャッシュのような他の便利な機能の多くをサポートしています:)

+0

これはあなたのために機能しましたか? – sethvargo

+0

残念ながら、Doctrineに切り替えるには余裕がありますが、ドキュメントを読んでみると、Datamapperはこれと似たようなことをすることができることに気付きました。 – TerryMatula

+0

あなたは、CIのdatamapperが大規模なプロジェクトのためにsubparであり、遅いことがわかります – sethvargo

3

私があなただったら、私はAAの実装を見てしまう - Doctrineはあなたのためのクエリを作成します

http://www.phpandstuff.com/articles/codeigniter-doctrine-from-scratch-day-1-install-and-setup

ツリー構造。あなたは本質的に(DBの観点から - あなたがまだ書いてテストしなければならないPHPコードで)ここに行く隣接リストのための基本設定を持っています。 level列を追加して階層内の任意のタスクがどのレベルにあるかを定義すると、自己結合によって1-2問合せのすべてのデータを取り出すことができますが、入れ子レベルがかなり深い場合は遅くなります。

代わりに、ネストされたセットとプリオーダーツリーのトラバーサルを使用することになります。これは特に、各ノードに複数のブランチを必要としないと考えられるので、はるかに多くの作業が必要です。

詳細については両方ともDBサイドから説明しているManaging Hierarchical Data in MySQLを見てください... MySQL固有のものですが、DBのアグノスティックな方法で、または別の特定のDBに対しても同じ原則を適用できるはずです。

もちろん、いずれにしても、PHP側でマッピングを実装する必要があります。これは現在行っている作業よりも多くの作業です。DBをより少ない回数だけ使用することもできます。

また、CI Datamapperの代わりにDoctrine(Sethも推奨)を使用することをお勧めします。これは既に実装されています。Doctrineの基本を学び、それをCIに繋ぐ必要があります。私はたくさんのチュートリアルがあると確信しています。

+0

それはすべてのmySQLです。あなたがリンクしたその文書は素晴らしかったです。ありがとう! – TerryMatula