Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$arrData = array( 'page' => $_POST['page_id'], // id страницы в mongo 'time' => $time, // время написания комментария 'name' => $_POST['name'], // имя написавшего 'comment' => $_POST['comment'] // сам комментрарий );
В примере представлен алгоритм и в нём есть допущения, а именно отсутствие сортировки комментариев и её персистетности.
id страницы. Если нет в посте reply производиться insert в монго т.е. комментарий первого уровня, а вот уже реплики на комментарий привязываеться к родителю(т.е. тогда когда есть reply ), по коду к стати довольно хорошо это видно, видимо плохо видно, видимо мой касяк.if(isset($_POST['reply']) && !empty($_POST['reply'])) по своей логике выглядит так:if(isset($_POST['reply']) && isset($_POST['reply']) && $_POST['reply'] == false) {
// Do something
}`$links его нет а значит он запишиться как корень. А это означает что алгоритм ошибочно привяжет комент где то в root. А не как дочерний элемент. public function getCommentsTree($post_id)
{
$comments = Comment::find()->where(['post_id' => $post_id])->indexBy('id')->all();
$topLevelComments = [];
foreach ($comments as $comment) {
if ($comment->parent_id) {
$parentComment = $comments[$comment->parent_id];
$comment->parentComment = $parentComment;
$parentComment->childComments[$comment->id] = $comment;
} else {
$topLevelComments[$comment->id] = $comment;
}
}
return $topLevelComments;
}
class Comment
{
public $id;
public $parent_id;
public $post_id;
// ...
// заполняется снаружи при загрузке из базы
public $parentComment = null;
public $childComments = [];
}
MongoDB хранение деревьев