
本文详解如何在 laravel 中通过 eloquent 模型或 query builder 从数据库读取内容并动态渲染到首页,涵盖模型定义、控制器调用、视图输出全流程,并为后续后台编辑功能奠定基础。
本文详解如何在 laravel 中通过 eloquent 模型或 query builder 从数据库读取内容并动态渲染到首页,涵盖模型定义、控制器调用、视图输出全流程,并为后续后台编辑功能奠定基础。
在 Laravel 中实现首页内容数据库驱动(如可编辑的 Banner 标题、欢迎语、简介等),核心在于建立「数据模型 → 控制器逻辑 → 视图渲染」的标准链路。相比原生 PHP 的 PDO 直连查询,Laravel 提供了更安全、可维护且符合 MVC 架构的两种主流方式:Eloquent ORM(推荐) 和 Query Builder(轻量快速)。下面以一个实际场景为例——在首页展示一条可管理的「欢迎标语」(存储于 pages 表中,字段为 id, slug, title, content, updated_at)——完整演示实现过程。
✅ 第一步:创建模型(推荐使用 Eloquent)
运行 Artisan 命令生成模型(假设表名为 pages):
php artisan make:model Page
Laravel 默认将模型存放在 app/Models/ 目录下(注意:Laravel 8+ 已将模型默认路径从 app/ 迁移至 app/Models/)。打开 app/Models/Page.php,按需配置:
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Page extends Model
{
use HasFactory;
// 指定关联的数据表(若表名非复数形式或不遵循约定)
protected $table = 'pages';
// 主键字段(默认为 'id',可省略)
protected $primaryKey = 'id';
// 若表中无 created_at/updated_at 字段,设为 false
public $timestamps = true;
// 允许批量赋值的字段(用于后续后台编辑)
protected $fillable = [
'slug',
'title',
'content',
];
// 可选:添加作用域,便于复用查询逻辑
public function scopeHomepage($query)
{
return $query->where('slug', 'homepage');
}
}
? 小贴士:Laravel 默认约定表名为模型名的复数形式(
Page→pages),若命名一致,$table属性可省略;$fillable是安全前提,避免 Mass Assignment 异常。
✅ 第二步:在控制器中获取数据
修改或新建首页控制器(如 app/Http/Controllers/HomeController.php):
<?php namespace App\Http\Controllers;
use App\Models\Page;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function index()
{
// 方式一:使用 Eloquent(推荐)——通过作用域精准获取首页内容
$homepage = Page::homepage()->firstOrFail();
// 方式二:基础查询(等价写法)
// $homepage = Page::where('slug', 'homepage')->firstOrFail();
return view('home', compact('homepage'));
}
}
⚠️ 注意:
firstOrFail()在未找到记录时自动抛出 404 异常,比first()+ 手动判空更符合 Laravel 风格;若需容错处理(如降级默认文案),可用first()并配合空值判断。
✅ 第三步:在 Blade 视图中渲染数据
在 resources/views/home.blade.php 中直接使用变量:
@extends('layouts.app')
@section('content')
<div class="container">
<h1>{{ $homepage->title }}</h1>
<div class="lead">{!! $homepage->content !!}</div>
<small class="text-muted">最后更新于:{{ $homepage->updated_at->diffForHumans() }}</small>
</div>
@endsection
? 安全提醒:若
content字段含 HTML(如富文本编辑器输出),使用{!! !!}渲染;若仅为纯文本,请改用{{ $homepage->content }}自动转义,防止 XSS。
? 替代方案:Query Builder(适合简单、临时查询)
若暂不建模或仅做一次性查询,可在控制器中使用 DB Facade:
use Illuminate\Support\Facades\DB;
public function index()
{
$homepage = DB::table('pages')
->where('slug', 'homepage')
->first();
if (!$homepage) {
abort(404, 'Homepage content not found.');
}
return view('home', compact('homepage'));
}
⚠️ 但此方式绕过模型层,无法享受 Eloquent 的关系、访问器、事件、软删除等特性,不建议长期用于业务核心逻辑。
? 后续扩展提示(为 Admin Panel 预留接口)
- ✅ 为
Page模型添加资源控制器:php artisan make:controller Admin/PageController --resource --model=Page - ✅ 在
routes/web.php中注册后台路由:Route::resource('admin/pages', Admin\PageController::class)->middleware('auth'); - ✅ 使用 Laravel Nova / Filament / 或自建 CRUD 表单,即可实现「后台编辑首页内容」功能。
综上,Laravel 的优雅之处正在于:一次建模,处处复用。从首页静态文本升级为数据库驱动内容,只需 3 步(建模 → 查询 → 渲染),且天然支持后续管理后台开发。不必重写 PDO 逻辑——让框架替你处理连接、预处理、ORM 映射与生命周期,专注业务表达。











