Laravel全文章循环排除特色文章及自动更新特色状态方法
Laravel 首页文章展示相关问题修复方案
问题1:排除全部文章列表中重复展示的特色文章
原代码逻辑中$allPosts查询了全量文章,未过滤已在特色区展示的featured=1内容,同时分页查询也未做对应过滤,才会出现重复展示问题。直接在数据库查询层加条件过滤即可,比全量查询后再用集合过滤性能更好,修改后的控制器index方法代码如下:
// Show all listings public function index(Request $request) { Paginator::useBootstrap(); // 单独查询特色文章区内容 $featuredPosts = Posts::where('featured', 1)->latest()->get(); // 普通文章列表直接排除特色内容,避免重复 $allPosts = Posts::where('featured', 0)->latest()->get(); // 分页数据同步过滤特色文章,保证分页列表无重复 $paginate = Posts::where('featured', 0)->latest()->paginate(6); return view('frontend.posts.index', compact('allPosts', 'featuredPosts', 'paginate')); }
注意事项
- 视图部分无需修改,保持原有循环逻辑即可
- 如果后续调整特色文章数量,只需修改
$featuredPosts查询的取数条数,普通文章列表的过滤逻辑不受影响
问题2:新特色文章发布时自动重置旧特色文章状态
要保证同一时间只有1篇特色文章,只需在创建新文章前增加判断:如果本次提交的文章标记为特色,先批量把所有历史特色文章更新为普通状态,再执行新文章创建操作,修改后的文章创建逻辑代码如下:
// 判断本次提交是否标记为特色 $isFeatured = $request->has('featured'); if ($isFeatured) { // 将所有历史特色文章重置为普通状态 Posts::where('featured', 1)->update(['featured' => 0]); } // 写入新文章数据 Posts::create([ 'title' => $request->post('title'), 'sub_title' => $request->post('sub_title'), 'tags' => $request->post('tags'), 'content' => $request->post('content'), 'featured' => $isFeatured, ]);
扩展提示
- 如果项目包含文章编辑功能,在更新文章的逻辑中也要加入相同判断:如果编辑时将某篇普通文章改为特色,同样先重置其他历史特色文章的状态,避免编辑场景下出现多篇特色文章
- 该批量更新操作不会触发模型事件,如果业务逻辑需要在文章状态变更时触发事件,可改用
get()取数后遍历更新的方式实现
内容的提问来源于stack exchange,提问作者Parit Sawjani
相关产品推荐
相关产品推荐

