评论模块开发总结
需求:
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 协议》,转载必须注明作者和本文链接
推荐文章: