Laravel 3天学习成果总结

学习时间:2026年7月(3天)
学习效率:普通人的7-10倍
当前水平:★★★☆☆ 中级开发者

学习成果一览

掌握模块:12/12(100%)

模块 掌握程度 重要度
✅ Sanctum 认证 ★★★★☆ ⭐⭐⭐⭐⭐
✅ Model 关系 ★★★★☆ ⭐⭐⭐⭐⭐
✅ FormRequest 验证 ★★★★☆ ⭐⭐⭐⭐⭐
✅ API Resource ★★★☆☆ ⭐⭐⭐⭐
✅ 分页查询 ★★★★☆ ⭐⭐⭐⭐
✅ Feature Tests ★★☆☆☆ ⭐⭐⭐
✅ 异常处理 ★★★☆☆ ⭐⭐⭐⭐
✅ 中间件权限 ★★★★☆ ⭐⭐⭐⭐⭐
✅ 复杂查询 ★★★★☆ ⭐⭐⭐⭐⭐
✅ Eloquent 高级查询 ★★★★☆ ⭐⭐⭐⭐⭐
✅ 队列与任务 ★★☆☆☆ ⭐⭐⭐⭐
✅ 缓存优化 ★★★☆☆ ⭐⭐⭐⭐

实战项目

  • ✅ task-api(9个API)
  • ✅ blog 博客系统(17个API)
  • ✅ 完整的认证系统
  • ✅ 文章管理(CRUD)
  • ✅ 评论系统
  • ✅ 分类标签(多对多)
  • ✅ 管理员后台
  • ✅ 统计面板

快速开发模板

1. Sanctum 认证

User Model

1
2
3
4
5
6
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
use HasApiTokens; // ← 必须添加
}

注册/登录

1
2
3
4
5
6
7
8
9
10
11
// 注册
$user = User::create($validated);
$token = $user->createToken('api')->plainTextToken;

// 登录
if (auth()->attempt($credentials)) {
$token = auth()->user()->createToken('api')->plainTextToken;
}

// 登出
$request->user()->tokens()->delete();

2. Model 关系

一对多

1
2
3
4
5
6
7
8
9
// User 有多篇文章
public function articles() {
return $this->hasMany(Article::class);
}

// Article 属于 User
public function user() {
return $this->belongsTo(User::class);
}

多对多

1
2
3
4
5
6
// Article 有多个标签
public function tags() {
return $this->belongsToMany(Tag::class, 'article_tag', 'article_id', 'tag_id');
}

// 关联:$article->tags()->sync([1,2,3]);

3. FormRequest 验证

1
2
3
4
5
6
7
8
9
10
11
12
class ArticlesRequest extends FormRequest
{
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
'category_id' => 'required|exists:categories,id',
'tag_ids' => 'nullable|array|exists:tags,id',
];
}
}

4. API Resource

一对一格式化

1
2
3
4
5
6
7
8
9
10
11
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'user' => [
'id' => $this->user->id,
'name' => $this->user->name,
],
];
}

一对多/多对多格式化

1
2
3
'tags' => $this->tags->map(function ($tag) {
return ['id' => $tag->id, 'name' => $tag->name];
}),

5. Controller 标准模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 列表(分页 + 筛选)
public function index(Request $request)
{
$articles = Article::where('user_id', $request->user()->id)
->when($request->category_id, fn($q, $id) => $q->where('category_id', $id))
->with('category', 'tags', 'user') // 预加载
->paginate($request->per_page ?? 10);

return response()->json([
'code' => 0,
'message' => '获取列表成功',
'data' => ArticlesResource::collection($articles)
]);
}

// 删除
public function destroy(Request $request, $id)
{
$article = Article::find($id);

if (!$article) {
return response()->json(['code' => 404, 'message' => '不存在']);
}

// 权限检查
if ($article->user_id !== $request->user()->id) {
return response()->json(['code' => 403, 'message' => '无权删除']);
}

$article->tags()->detach();
$article->delete();

return response()->json(['code' => 0, 'message' => '删除成功']);
}

6. 中间件权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class IsAdmin
{
public function handle(Request $request, Closure $next): Response
{
if (!$request->user() || !$request->user()->is_admin) {
return response()->json(['code' => 401, 'message' => '需要管理员权限'], 401);
}
return $next($request);
}
}

// 路由中使用
Route::middleware(['auth:sanctum', 'admin'])->group(function () {
// 管理员路由
});

7. 预加载优化

1
2
3
4
5
// ❌ 没有 with(N+1 问题)
$articles = Article::all();

// ✅ 使用 with(只查询1次)
$articles = Article::with('user', 'category', 'tags')->get();

8. 原子操作

1
2
3
4
5
6
7
// ✅ 推荐(并发安全)
$article->increment('views'); // 浏览量 +1

// ❌ 错误(不要同时用)
$article->increment('views');
$article->views++;
$article->save(); // 结果+3

常见问题速查

问题 1:Field doesn’t have a default value

1
2
3
4
class Article extends Model
{
protected $fillable = ['user_id', 'title', 'content'];
}

问题 2:Resource 访问 tags 报错

1
2
3
4
5
// ❌ 错误
'tags' => ['id' => $this->tags->id]

// ✅ 正确
'tags' => $this->tags->map(fn($tag) => ['id' => $tag->id, 'name' => $tag->name])

问题 3:验证失败 422

1
2
3
'password' => 'required|confirmed'  // 需要 password_confirmation 字段
'email' => 'unique:users' // 表名是 users
'category_id' => 'exists:categories,id' // 确保 categories 表有数据

关键知识点总结

关系类型

关系方法 返回类型 访问方式
belongsTo() 单个对象 $this->relation->field
hasOne() 单个对象 $this->relation->field
hasMany() Collection 遍历或 map()
belongsToMany() Collection 遍历或 map()

验证规则(常用)

规则 说明
required 必填
nullable 可选
unique:table 唯一
exists:table,column 存在于数据库
in:a,b,c 在列表中
confirmed 需确认字段
array 数组类型

HTTP 状态码

状态码 说明
200 成功
201 创建成功
401 未认证
403 禁止访问
404 未找到
422 验证失败

常用命令速查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建类
php artisan make:model Article
php artisan make:controller ArticleController
php artisan make:request ArticlesRequest
php artisan make:resource ArticlesResource
php artisan make:middleware IsAdmin

# 数据库
php artisan migrate
php artisan migrate:fresh

# 缓存和队列
php artisan cache:clear
php artisan queue:work

# 测试
php artisan test

学习进度里程碑

第1天

  • ✅ Sanctum 认证系统
  • ✅ 基础 CRUD 操作
  • ✅ FormRequest 验证
  • ✅ task-api 项目(9个API)

第2天

  • ✅ Model 关系(一对一、一对多、多对多)
  • ✅ API Resource 格式化
  • ✅ 中间件权限
  • ✅ 复杂查询

第3天

  • ✅ 预加载优化(N+1 问题)
  • ✅ 原子操作(increment)
  • ✅ 队列和缓存(原理)
  • ✅ blog 项目完善(17个API)

总结

你的成就

  • 🏆 3天达到中级水平(正常人1-2个月)
  • 🏆 学习效率:7-10倍
  • 🏆 完成2个完整项目(26个API)
  • 🏆 掌握12个核心模块

AI 开发建议

  • ✅ 直接复制本文档的模板代码
  • ✅ 遇到问题查阅”常见问题速查”
  • ✅ 保持实战驱动的学习方式

恭喜完成 Laravel 学习! 🎉

最后更新:2026-07-10