
本文详解如何在 laravel 9 中通过数据库字段 + 模型查询 + 表单控制,实现文章“置顶/推荐”功能,包括迁移配置、表单提交处理、数据查询及安全注意事项。
本文详解如何在 laravel 9 中通过数据库字段 + 模型查询 + 表单控制,实现文章“置顶/推荐”功能,包括迁移配置、表单提交处理、数据查询及安全注意事项。
在 Laravel 9 中实现“Featured Post”(推荐文章)功能,本质是为 posts 表添加一个布尔标识字段,并通过逻辑控制其值(0 表示普通文章,1 表示推荐文章),再配合查询与视图渲染完成业务闭环。以下是完整、可落地的实现步骤:
✅ 1. 数据库迁移:添加 featured 字段
确保该字段为 TINYINT(1) 类型并设默认值 0(即默认不推荐):
// 在迁移文件中(如 create_posts_table.php)
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('sub_title')->nullable();
$table->text('tags');
$table->longText('content');
$table->tinyInteger('featured')->default(0); // 关键:tinyint + default(0)
$table->timestamps();
});
⚠️ 注意:若已存在数据表,请新建迁移(勿直接修改旧迁移),运行 php artisan migrate。切勿使用 ->default(0) 修改已有列——应使用 DB::statement() 或 change() 方法(需启用 doctrine/dbal)。
✅ 2. 表单与控制器:支持用户选择是否置顶
当前控制器中 featured 字段仅设为 nullable,但未做类型校验或默认赋值。建议优化如下:
// PostsController@store
public function store(Request $request)
{
$formFields = $request->validate([
'title' => 'required|string|max:255',
'sub_title' => 'nullable|string|max:255',
'tags' => 'required|string',
'content' => 'required|string',
'featured' => 'nullable|in:0,1', // 显式限制输入值,防恶意提交
]);
// 若表单未传 featured,默认为 0;若传 '1',则设为 1
$formFields['featured'] = $request->filled('featured') ? 1 : 0;
Posts::create($formFields);
return redirect('/')->with('success', '文章发布成功!');
}
同时,在 Blade 表单中添加开关控件(如复选框):
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
<!-- resources/views/posts/create.blade.php -->
<div class="mb-4">
<label class="inline-flex items-center">
<input type="checkbox" name="featured" value="1" class="rounded border-gray-300"><span class="ml-2 text-gray-700">设为推荐文章</span>
</label>
</div>
✅ 复选框优势:未勾选时 $_POST 不包含 featured 键,$request->filled('featured') 自然返回 false,安全可靠。
✅ 3. 查询与展示:高效获取推荐文章
在首页或侧栏等需要展示推荐内容的位置,使用链式查询精准获取:
// 控制器中(如 HomeController@index)
public function index()
{
$featuredPosts = Posts::where('featured', 1)
->latest()
->limit(3)
->get();
$allPosts = Posts::latest()->paginate(10);
return view('home', compact('featuredPosts', 'allPosts'));
}
对应 Blade 视图中调用:
<!-- 推荐区 -->
@if($featuredPosts->isNotEmpty())
<section class="bg-blue-50 p-6 rounded-lg mb-8"><h2 class="text-xl font-bold text-blue-800 mb-4">? 精选推荐</h2>
@foreach($featuredPosts as $post)
<article class="mb-4"><h3 class="font-semibold">{{ $post->title }}</h3>
<p class="text-sm text-gray-600">{{ Str::limit($post->content, 100) }}</p>
</article>
@endforeach
</section>
@endif
⚠️ 安全与最佳实践提醒
- 永远不要信任前端输入:即使使用复选框,也必须在后端校验 featured 值是否为 0 或 1(如 in:0,1 规则);
- 避免 N+1 查询:若推荐文章需关联作者、分类等,使用 with() 预加载;
- 权限控制(进阶):生产环境建议限制仅管理员可设置 featured=1,可在验证规则中加入 required_if:role,admin 或中间件拦截;
- SEO 友好:推荐文章可在 标签或 JSON-LD 中标注 @type: "Article" + "isAccessibleForFree": true 等增强语义。
至此,你已具备完整的 Laravel 9 推荐文章能力:从数据建模、用户交互、服务端处理到前端展示,每一步都兼顾健壮性与可维护性。后续还可扩展为多级推荐(如 priority: tinyint default 0)、定时生效、或结合 Scout 实现搜索加权。










