我的网站上有文章,而这些文章也有评论。注释可以包含子注释,而这些注释可以包含子注释,几乎永远存在。
在我的Comment.php
模型中,子注释是通过hasMany关系来组织的:
public function children() {
return $this->hasMany('App\Comment','parent_id');
}
在我的控制器中,我得到的注释没有这样的父母:
$comments = Comment::where('submission_id', $submission->id)->where('parent_id', NULL)->get();
然后在刀片视图中将它们foreach
>
<div class="comment-thread-container">
@foreach ($comments as $comment)
@include('partials.comment_block')
@endforeach
</div>
其中包括一个名为comment-block.blade.php
的子视图,该子视图针对每个注释而调用。
此子视图中的另一个foreach
调用该评论的孩子:
@foreach ($comment->children as $comment)
<div style="margin-left: 8px">
@include('partials.comment_block')
</div>
@endforeach
从本质上讲,这可以永远持续下去。但是,我不想这么做。
我要这样做,例如,如果评论有10代父母(这样评论将生一个孩子,而该评论将生一个孩子,等等,等等,等等)10次,它将停止并显示带有“显示整个线程”之类的链接,该链接将链接到其自己的页面。
但是,我不知道该怎么做。计算递归的最优雅方法是什么?
Reddit做得很好,对于那些不太了解我的问题的人来说,这张图片可能会有所帮助:
答案 0 :(得分:3)
显然,在Blade模板中,每个$loop
语句中都会自动创建一个@foreach
变量。
此变量具有的众多属性之一是$loop->depth
。
这将计算当前循环的嵌套级别。
因此,在我的情况下,当嵌套循环达到10
时,我只需@break
递归即可。
@foreach ($comment->children as $comment)
@if ($loop->depth == 10)
@include('partials.comment_end')
@break
@else
<div style="margin-left: 8px">
@include('partials.comment_block')
</div>
@endif
@endforeach