核心是用好php artisan make:model、make:controller和Route::resource();数据库需手动创建,迁移只建表不建库;.env修改后须php artisan config:clear;迁移文件要补业务字段;Route::resource()勿重复手写路由;控制器需继承Controller;Blade路径须严格匹配;列表页推荐Post::latest()->paginate(10)。

直接上手做 Laravel 博客,核心不是“从零写所有代码”,而是用好 php artisan make:model、php artisan make:controller 和 Route::resource() 这三样东西。只要数据库配对、路由注册正确、控制器方法不空,首页列表和增删改查页面基本能跑通。
数据库迁移前必须确认 .env 里的 DB_DATABASE 已存在
很多人卡在 php artisan migrate 报错,错误信息通常是 SQLSTATE[HY000] [1049] Unknown database 'blog'。这不是 Laravel 的问题,是 MySQL 根本没这个库。
- 别指望
php artisan migrate自动建库 —— 它只建表,不建库 - 用 MySQL 客户端或命令行手动执行:
CREATE DATABASE `blog` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -
DB_USERNAME和DB_PASSWORD要跟实际创建的 MySQL 用户一致(不推荐用root) - 改完
.env后必须清缓存:php artisan config:clear,否则配置不生效
php artisan make:model Post -m 生成的迁移文件要手动补字段
运行命令后,database/migrations/xxxx_create_posts_table.php 里默认只有 id、timestamps,没有标题、内容这些业务字段。不改就迁移,表结构会残缺。
- 打开迁移文件,在
up()方法里加:$table->string('title');和$table->text('content'); - 如果需要支持软删除(推荐),加上:
$table->softDeletes(); - 别漏掉
use Illuminate\Database\Migrations\Migration;和命名空间声明 - 改完立刻运行:
php artisan migrate,不要等写完控制器再回头补
用 Route::resource('posts', PostController::class) 就别再手写七条路由
新手常犯的错:一边写了 Route::resource(),一边又在下面重复写 Route::get('/posts/create', ...),结果 create 和 edit 页面报 404 —— 因为命名冲突或中间件没继承。
-
Route::resource()默认注册 7 个标准动作,对应控制器里index、create、store、show、edit、update、destroy - 控制器必须继承
Controller,且不能漏掉use App\Http\Controllers\Controller; - Blade 模板路径要严格匹配:比如
PostController@index返回return view('posts.index');,就得有resources/views/posts/index.blade.php - 想限制只开放部分动作?用
only参数:Route::resource('posts', PostController::class)->only(['index', 'show']);
Post::all() 在控制器里直接调用没问题,但上线前得加 ->latest() 和分页
开发阶段用 Post::all() 看得快,但真有几十篇文章时,首页加载变慢、内存飙升,甚至触发 PHP 内存限制。
- 列表页改用:
Post::latest()->paginate(10),自动处理分页参数和链接 -
paginate()返回的是LengthAwarePaginator实例,Blade 中用{{ $posts->links() }}渲染页码 - 别在循环里反复查关联数据(比如每篇文章查作者)—— 用
with('user')预加载避免 N+1 查询 - 如果只是展示标题和摘要,用
select('id', 'title', 'excerpt')减少传输量
最易被忽略的一点:Laravel 默认关闭了模型批量赋值保护($fillable),但你新建 Post 模型时,如果不显式定义 protected $fillable = ['title', 'content'];,Post::create($request->all()) 会静默失败 —— 表里什么也不插,还不报错。


















