5分钟内可跑通基础crud,但需补全迁移字段、配置主键与表名、使用@method伪造put/patch、启用软删除及时间戳控制,并优先采用eloquent而非查询构造器。

直接用 php artisan make:controller 加 --resource 生成骨架,再配好路由和模型,5 分钟内就能跑通基础 CRUD —— 但别急着提交,漏掉迁移、主键配置或表名约定,后面全会报错。
生成资源控制器和模型要带 -m
只运行 php artisan make:controller PostController --resource 是不够的。它只生成空方法,没模型、没表、没字段。
- 必须加
-m:执行php artisan make:model Post -m,这样会同时创建 migration 文件和模型类 - 迁移文件里要手动补全字段,比如
$table->string('title')、$table->text('content'),别依赖默认空结构 - 模型类默认继承
Illuminate\Database\Eloquent\Model,但如果表名不是复数(如post而非posts),得在模型里显式写protected $table = 'post';
Route::resource() 默认行为和常见断点
Route::resource('posts', 'PostController'); 看似省事,但实际请求路径和方法绑定是固定的,容易和前端 form 的 method 冲突。
- POST /posts →
store(),但 HTML 表单默认是 POST,没问题;编辑页的更新却要用 PUT/PATCH,而浏览器原生 form 不支持 PATCH,得靠@method('PUT')或隐藏字段伪造 - DELETE /posts/{id} →
destroy(),同样需要@csrf+@method('DELETE'),缺一不可,否则返回 419 或 405 - 如果只想暴露部分操作(比如不要
create和edit页面),用except:Route::resource('posts', 'PostController')->except(['create', 'edit']);
Eloquent 写法比查询构造器更稳,但要注意主键和时间戳
用 DB::table('posts')->insert(...) 能跑,但很快会踩坑:比如没设 created_at 报错、主键不是 id 插不进、软删除字段缺失导致 delete 失效。
- 模型里若主键不是
id,必须声明:protected $primaryKey = 'post_id'; - 如果表里没有
created_at/updated_at,关掉时间戳:public $timestamps = false; - 软删除要主动启用:
use SoftDeletes;并确保迁移里有$table->softDeletes();,否则delete()是物理删除 -
findOrFail($id)比find($id)更安全,避免空对象调用方法报错
分页和批量操作别硬写 SQL
手写 limit + offset 不仅难维护,还绕过 Laravel 的分页器样式和链接生成逻辑。
- 查列表一律用
Post::paginate(10),视图里直接{{$posts->links()}} - 批量插入用
Post::insert([...]),不是DB::table()->insert(),前者能走模型事件、自动处理时间戳 - 条件更新别用
DB::table()->where(...)->update(...),优先走模型:Post::where('status', 'draft')->update(['status' => 'published']),语义清晰且兼容观察者
真正卡住人的从来不是“怎么写”,而是迁移没跑、.env 数据库配置不对、模型没关联表、或者 Blade 模板里用了 $post->name 却忘了 Post::all() 返回的是集合而非单条 —— 这些地方没报错,但页面空白或 500,得一个个 echo 或 dd 排查。











