You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:51:26