使用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 去做排序工作