次のデータ構造 (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();
この方法についての助けをいただければ幸いです。
ありがとう