评论模块开发总结

需求:
1、仅限登录用户评论(认证这块儿就很简单了)
2、评论占一楼。对这条评论追加评论显示在其下方。(百度贴吧的样子)

由于选择了百度贴吧样式的评论形式,所以也不用嵌套,挺方便。

这篇文章最主要解决的也不是上述几点,而是怎样利用好Laravel框架提供的模型关联预加载功能。

模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
    public function childComments()
    {
        return $this->hasMany(Comment::class, 'pid');
    }
}

看到了没有,在Comment的模型里,关联了子评论(就是上面讲到的评论的评论)。这个用法(我不知道该叫什么,我自己叫它子模型),我好像没有在文档中看到,但是在其他人的源码中发现了,于是我就拿来用了。pid我想都懂,评论的pid为0,评论的评论pid为评论id。

获取数据

$comments = Comment::with('user','childComments.user')->where('pid', '0')->orderBy('id')->get();

这段代码很容易看懂,关键是那个 childComments.user 。user在第一层循环的时候用来解决N+1的问题,childComments.user是在第二层循环的时候解决N+1的问题。原来模型关联查询还能嵌套,Laravel考虑的确实非常周到。卡在这里几个小时,希望这篇文章可以帮助到刚开始学习的朋友。

最后附上视图文件里的写法。

@foreach($comments as $comment)
    {{$comment->user-name}}评论了{{$comment->content}}     
    @foreach($comment->childComments as $childComment)
        {{$childComment->user-name}}评论了{{$childComment->content}}
    @endforeach

@endforeach
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!