Laravel 顯示回覆樓層

使用Blade計算

不使用數據庫的值,而直接使用 $loop->index

 @if((request()->get('page')>0))
    #{{$loop->index+1+(request()->get('page')*15)-15}}
 @else
    #{{$loop->index+1}}
 @endif

上面的例子是每頁15個回覆

if 不是第一頁,就把所有index+1 (因為$loop由0開始), 然後把頁面頁數*15然後再-15 = 這一頁的第1個樓層的數值

if 當天沒有get('page')意味著是在第一頁,那麼直接把所有樓層+1即可 (因為$loop由0開始)

數據庫模式

我假設你把樓層的字段設定為 sort

保存回覆時

如果你的樓層數值保存了在SQL,那麼每次寫入回覆時,都需要保存當前最大的sort值並且+1

//獲得當前最大的樓層數並 +1
$post->sort = Post::where('topic_id',$id)->max('sort')+1;
///同步你會保存其他的資料
$post->save();

max('sort') 獲得該欄位中最大的值 where('topic_id',$id) 找到當前回覆中主題的所有回覆

刪除回覆時

刪除回覆時:應該把大於當前回覆的所有回覆sort進行-1

//找到要刪除的Row
$post = Post::find($id);
//樓層大於當前要刪除的請全部 -1, 這邊用了decrement()
Post::where('topic_id', $post->topic_id)->where('sort', '>', $post->sort)->decrement('sort');
//刪除回覆
$post->delete();

如果數據發生問題

建立一個「修復數據」的function

public function repair( $id) {
    $row = Post::where('tid', $topic_id)
    ->select('id', 'sort')
    ->orderBy('sort', 'ASC')
    ->get();
    foreach ($row as $k => $v) {
        $new_sort = $k + 1;
        Post::where('id', $v->id)->update(['sort' => $new_sort]);
    }
}

當然如果你的主題中有個回覆Count 欄位,也應該在刪除/修復功能的位置加上

後記

哪個方法好?

當然如果你的網站流量少,用第1個使用Blade計算 就可以,但你可以想像一下,我假設你每頁有15個樓層,每一位這個顯示樓層的位置都要計算一次,甚至要加一次if判斷你是否在第一頁,會不會多多少少有些影響速度?

深入一點思考,瀏覽的人多,還是執行刪除的人多?

正常來講一定是瀏覽的人更多,那麼直接使用數據庫中的sort來顯示而不需要去計算是最好的

另外就是,即使你同一篇主題中有很多的回覆,你每次刪除都要批量執行一次decrement('sort'),甚至foreach去修復,但感受到這種等待的也只有管理員而不是大量的用戶

最後,也別忘記了Laravel 能用Job 去做排序工作