Я использую вложенный набор комментариев (пакет Kalnoy) в своем проекте, и я застрял в создании комментариев детей. Я создал два разных метода для обоих типов комментариев.
Сохранение корневых комментариев работает нормально:
public function storeComments(Request $request, Post $post)
{
$comment = Comment::create(
[
'body' => request('body'),
'user_id' => auth()->id(),
'post_id' => $post->id,
]
)->saveAsRoot();
return back();
}
Однако комментарии детей по-прежнему сохраняются в качестве корневых комментариев.
public function storeNestedComments(Request $request, Comment $comment, Post $post)
{
$comment->children()->create(
[
'body' => request('body'),
'user_id' => auth()->id(),
'parent_id' => $comment->id,
'post_id' => $post->id,
]
);
return back();
}
Эта переменная $ comment во втором методе, естественно, равна нулю. Как я могу получить доступ к комментарию, который был сохранен как root?
Обновление: логика saveAsRoot ()
public function saveAsRoot()
{
if ($this->exists && $this->isRoot()) {
return $this->save();
}
return $this->makeRoot()->save();
}
Это должно сделать трюк:
public function storeNestedComments($parent_comment_id)
{
$parent = Comment::findOrFail($parent_comment_id);
Comment::create([
'body' => request('body'),
'user_id' => auth()->id(),
'parent_id' => $parent->id,
'post_id' => $parent->post_id
], $parent);
return back();
}
Я исправил то, как вы извлекаете родительский комментарий, он делает то же самое, но лучше написано, плюс он бросит ModelNotFoundException
если комментарий не может быть получен 🙂
@ Амори дал мне подсказку 🙂
Я изменил свой маршрут, чтобы включить идентификатор корневого комментария
Route::post('/posts/{post}/{comment}/nestedcomments', 'CommentsController@storeNestedComments');
Передал этот идентификатор в метод и связал дочерний идентификатор с родительским.
public function storeNestedComments($parent_comment_id)
{
$comment = Comment::where('id', $parent_comment_id)->first();
$nestedComment = Comment::create(
[
'body' => request('body'),
'user_id' => auth()->id(),
'parent_id' => $parent_comment_id,
'post_id' => $comment->post_id,
]
);
$nestedComment->parent()->associate($comment)->save();
return back();
}