ツリーを構築する方法は?
私は答えた:
mongodbとそこからツリーのあるドキュメントを取り出します
彼らは私に電話をかけませんでしたが、私は今mongoDBを勉強していて、Mysqlが好きではないことに気を悪くしていません(残念ながら、または残念ながらわかりません)。 一般的に、それがすべてどのように機能するか見てみましょう? phpで記述されたコメントツリーの例。
コードをすぐに提供します。
// mongodb // /** * @return \MongoDB\Driver\Manager * */ static function getConnect() { if(!is_null(self::$_connect)) { return self::$_connect; } self::$_connect = new \MongoDB\Driver\Manager(Config_Db::getConf()['mongodb']['connect']); return self::$_connect; } // /** * add comment action */ public function addCommentAction() { $time = time(); // //insert new comment to the page $arrData = array( 'page' => $_POST['page_id'], // id mongo 'time' => $time, // 'name' => $_POST['name'], // 'comment' => $_POST['comment'] // ); $connect = Core_Model_Mongo::getConnect(); // // // $write = new MongoDB\Driver\BulkWrite(); $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY); // , - , reply id if(isset($_POST['reply']) && !empty($_POST['reply'])) { // id $reply = $_POST['reply']; // // , $path = ''; if(isset($_POST['path']) && !empty($_POST['path'])) { $path = $_POST['path']; } else { $path = 'replies'; } // , $write->update( array('_id' => new MongoDB\BSON\ObjectID($reply)), // array('$push' => array($path => $arrData) ) // push, , path ); } else { $write->insert($arrData); // } // $connect->executeBulkWrite(Config_Db::getConf()['mongodb']['db'] . '.comments', $write, $writeConcern); // header('Location:' . $_POST['back_url']); }
したがって、保存するパスはパス変数に渡されます。たとえば、mongoにコメントがあります。これを「クリーン」な配列と考えてください。実際には、これはオブジェクトの配列なので、すべてを配列に単純化します。
1つのコメント配列
array ( 'name' => 'test', 'comment' => 'test comment', );
更新後、pushおよびpath = 'reply'変数を使用して、配列は次の形式になります。
プッシュ後の配列
array ( 'name' => 'test', 'comment' => 'test comment', 'reply' => array ( [0] => array( 'name' => 'test reply test' 'comment' => 'test comment reply' ) ) );
添付されたコメントに応答すると、パスは「reply.0.reply」という形式になります。つまり、コメントの応答で、0要素を取得し、データを含む新しい応答フィールドを挿入します。操作の後、次の配列を取得します。
ネストされたコメントのレプリカを持つ配列
array ( 'name' => 'test', 'comment' => 'test comment', 'reply' => array ( [0] => array( 'name' => 'test reply test' 'comment' => 'test comment reply' 'reply' => array ( [0] => array( 'name' => 'test reply test' 'comment' => 'test comment reply' ) ) ) ) );
そして、それがすべて、アルゴリズム全体です。単にこの配列を挿入して、そのままレンダリングするために使用します。 レンダリングはそれほど重要な部分ではないので、ペイントしません。もちろん、print_r()を使用して冗談として行いますが、原則は同じです。ご愛顧の皆様、ありがとうございます。
PS:例では、アルゴリズムが提示されており、それは仮定、すなわちコメントのソートの欠如とその永続性を持っています。