如何限制递归? -Laravel / Blade

时间:2019-07-16 20:55:12

标签: php laravel

我的网站上有文章,而这些文章也有评论。注释可以包含子注释,而这些注释可以包含子注释,几乎永远存在。

在我的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做得很好,对于那些不太了解我的问题的人来说,这张图片可能会有所帮助:

reddit

1 个答案:

答案 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

此处的文档: https://laravel.com/docs/5.8/blade#loops