需求:
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 協議》,轉載必須註明作者和本文連結