0

次のデータ構造 (category_id、parent_id、position、および level を無視) を、子参照を使用したモデル ツリー構造の方法に従って mongo Db に入力したい: http://docs.mongodb.org/manual/tutorial/model-tree -構造物/

    object(Node)#1 (6) {
  ["category_id"]=>
  int(1)
  ["parent_id"]=>
  int(0)
  ["name"]=>
  string(4) "Root"
  ["position"]=>
  int(0)
  ["level"]=>
  int(0)
  ["children"]=>
  array(2) {
    [0]=>
    object(Node)#2 (6) {
      ["category_id"]=>
      int(2)
      ["parent_id"]=>
      int(1)
      ["name"]=>
      string(15) "Root MySite.com"
      ["position"]=>
      int(0)
      ["level"]=>
      int(1)
      ["children"]=>
      array(1) {
        [0]=>
        object(Node)#3 (6) {
          ["category_id"]=>
          int(15)
          ["parent_id"]=>
          int(2)
          ["name"]=>
          string(7) "Widgets"
          ["position"]=>
          int(68)
          ["level"]=>
          int(2)
          ["children"]=>
          array(2) {
            [0]=>
            object(Node)#4 (6) {
              ["category_id"]=>
              int(24)
              ["parent_id"]=>
              int(15)
              ["name"]=>
              string(11) "Blue Widget"
              ["position"]=>
              int(68)
              ["level"]=>
              int(3)
              ["children"]=>
              array(0) {
              }
            }
            [1]=>
            object(Node)#5 (6) {
              ["category_id"]=>
              int(25)
              ["parent_id"]=>
              int(15)
              ["name"]=>
              string(13) "Purple Widget"
              ["position"]=>
              int(68)
              ["level"]=>
              int(3)
              ["children"]=>
              array(0) {
              }
            }
          }
        }
      }
    }
    [1]=>
    object(Node)#6 (6) {
      ["category_id"]=>
      int(100)
      ["parent_id"]=>
      int(1)
      ["name"]=>
      string(10) "FooBar.com"
      ["position"]=>
      int(0)
      ["level"]=>
      int(1)
      ["children"]=>
      array(1) {
        [0]=>
        object(Node)#7 (6) {
          ["category_id"]=>
          int(150)
          ["parent_id"]=>
          int(100)
          ["name"]=>
          string(6) "Gizmos"
          ["position"]=>
          int(68)
          ["level"]=>
          int(2)
          ["children"]=>
          array(2) {
            [0]=>
            object(Node)#8 (6) {
              ["category_id"]=>
              int(240)
              ["parent_id"]=>
              int(150)
              ["name"]=>
              string(11) "Blue Gizmos"
              ["position"]=>
              int(68)
              ["level"]=>
              int(3)
              ["children"]=>
              array(0) {
              }
            }
            [1]=>
            object(Node)#9 (6) {
              ["category_id"]=>
              int(250)
              ["parent_id"]=>
              int(150)
              ["name"]=>
              string(13) "Purple Gizmos"
              ["position"]=>
              int(68)
              ["level"]=>
              int(3)
              ["children"]=>
              array(0) {
              }
            }
          }
        }
      }
    }
  }
}

ツリーをトラバースしてデータを挿入するための適切なphpコードを思いつくことができません。

これが私がこれまでに持っているものです:

 public function behaviors()
  {
    return array(
        'embeddedArrays' => array(
          'class'=>'ext.YiiMongoDbSuite.extra.EEmbeddedArraysBehavior',
          'arrayPropertyName' => 'categories',
          'arrayDocClassName' => 'Category',
          ));
  }

  public function setCategories($user_id)
  {
    $api = new ApiCategory($user_id); 
    $cats = $api->getCategories(); // retrieves structure above

    $this->recursiveCategoryTree($cats);

    $this->save(); // save the entire array of embedded documents

    if($this->getErrors())
      var_dump($this->getErrors);

  }

  public function recursiveCategoryTree($tree, $i = 0)
  {
    foreach ($tree->children as $child) {
      if ($count($child->children ) > 0 ){
        $this->categories[$i] = new Category();
        $this->categories[$i]->_id = $tree->name; 
        $i++;
        $this->getCategoryTree($child, $i);
      }
      else{
        $this->categories[--$i]->children[] = $child->name;
      } 
    } 
  }

機能させるためにいくつかの異なる方法を試しましたが、カウンターが正確にどのように機能するかわかりません。私が使用している php フレームワーク (http://canni.github.com/YiiMongoDbSuite/xhtml/basic.arrays.embedded-documents.html) では、categories[index] メソッドを使用できます。ドキュメントによると、次のように動作するはずです。

$data = new Data();
$data->categories[0] = new Category();
$data->categories[0]->_id = 'Root';
$data->categories[0]->children = array("Root MySite.com", "FooBar.com");
$data->categories[1]->_id = 'Root MySite.com';
$data->categories[1]->children = {immediate children};
$data->save();

この方法についての助けをいただければ幸いです。

ありがとう

4

1 に答える 1

0

編集:すべての新しいデータで、あなたが達成しようとしていることを明確に理解しています。

だから私は私の古い関数を編集しました.これはあなたのコードでうまく動作するはずの新しい関数です. 必要に応じて調整できるようにお知らせください。

public function setCategories($user_id)
{
    $api = new ApiCategory($user_id);
    $cats = $api->getCategories(); // retrieves structure above

    $newCats = null;
    self::recursiveCatTree($newCats, $cats);
    $this->categories = $newCats;

    $this->save(); // save the entire array of embedded documents

    if($this->getErrors())
        var_dump($this->getErrors);

}

public static function recursiveCatTree(&$result, $parent)
{
    $children = $parent['children'];

    //we unset the children so we dont have manually set every other variable
    unset( $parent['children']);
    $result = new Category();
    $result->attributes = $parent;

    //then loop the children, if no children it wont loop
    // so it will just be an empty    array
    foreach($children as $child)
    {
       $baby = null;
       self::recursiveCatTree($baby, $child);
       $result->children[] = $baby;
    }

}
于 2013-01-11T10:56:24.587 に答える