LC02 第 3 遍学习小结 -- 操作记录 4
由于LC02教程和实际需要开发的项目之间存在差异,所以第3遍学习只关注自己实际项目必须会用到的技能点。
第五章. 帖子列表
5.1 帖子分类
本节是在创建分类,实际上,实际项目中所有需要使用下拉列表的地方都可以通过这种方式来完成。
1) 数据模型
$ php artisan make:model Models/Category -m
2) 数据库迁移vi {timestamp}_create_categories_table.php
写入自己需要添加的字段
这一步非常重要
$ php artisan migrate
3) 设置数据模型的$fillable
白名单属性
4) 初始化分类数据
$ php artisan make:migration seed_categories_data
vi database/migrations/{timestamp}_seed_categories_data.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class SeedCategoriesData extends Migration
{
public function up()
{
$categories = [
[
'name' => '分享',
'description' => '分享创造,分享发现',
],
[
'name' => '教程',
'description' => '开发技巧、推荐扩展包等',
],
[
'name' => '问答',
'description' => '请保持友善,互帮互助',
],
[
'name' => '公告',
'description' => '站点公告',
],
];
DB::table('categories')->insert($categories);
}
public function down()
{
DB::table('categories')->truncate();
}
}
$ php artisan migrate
5) 版本控制
$ git add -A
$ git commit -m "分类模型和数据"
5.2 代码生成器
代码生成器能让你通过执行一条 Artisan 命令,完成注册路由、新建模型、新建表单验证类、新建资源控制器以及所需视图文件等任务,不仅约束了项目开发的风格,还能极大地提高我们的开发效率。
本节有几个git命令,值得记住。
1) 安装
$ composer require "summerblue/generator:~1.0" --dev
2) 常用git命令
// 回滚数据库迁移
$ php artisan migrate:rollback
// 还原修改文件到原始状态:
$ git checkout .
// 还原新建文件到原始状态:
$ git clean -f -d
3) 版本控制
$ git add -A
$ git commit -m "新增 generator 扩展"
5.3 生成话题骨架
1) 整理字段
在使用代码生成器之前,我们需要先整理好 xxx 表的字段名称和字段类型。比如:
字段名称 | 描述 | 字段类型 | 加索引缘由 | 其他 |
---|---|---|---|---|
title |
帖子标题 | 字符串(String) | 文章搜索 | 无 |
body |
帖子内容 | 文本(text) | 不需要 | 无 |
user_id |
用户 ID | 整数(int) | 数据关联 | unsigned() |
category_id |
分类 ID | 整数(int) | 数据关联 | unsigned() |
reply_count |
回复数量 | 整数(int) | 文章回复数量排序 | unsigned() , default(0) |
view_count |
查看总数 | 整数(int) | 文章查看数量排序 | unsigned() , default(0) |
last_reply_user_id |
最后回复的用户 ID | 整数(int) | 数据关联 | unsigned() , default(0) |
order |
可用来做排序使用 | 整数(int) | 不需要 | default(0) |
excerpt |
文章摘要,SEO 优化时使用 | 文本(text) | 不需要 | nullable() |
slug |
SEO 友好的 URI | 字符串(String) | 不需要 | nullable() |
unsigned()
—— 设置不需要标识符(unsigned)default()
—— 为字段添加默认值。nullable()
—— 可为空
拼接为最终命令:
$ php artisan make:scaffold Topic --schema="title:string:index,body:text,user_id:integer:unsigned:index,category_id:integer:unsigned:index,reply_count:integer:unsigned:default(0),view_count:integer:unsigned:default(0),last_reply_user_id:integer:unsigned:default(0),order:integer:unsigned:default(0),excerpt:text:nullable,slug:string:nullable"
2) 版本控制
$ git add -A
$ git commit -m "生成话题骨架"
5.4 假数据填充
一、 填充用户数据
1) 用户的数据工厂vi database/factories/UserFactory.php
由于实际项目的用户表不止教程中的那几个字段,这里就不copy了。
2) 用户数据填充
$ php artisan make:seed UsersTableSeeder
由于实际项目的用户表不止教程中的那几个字段,这里就不copy了。
3) 注册数据填充类vi database/seeds/DatabaseSeeder.php
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call(UsersTableSeeder::class);
// $this->call(TopicsTableSeeder::class);
}
}
4) 测试
可以
$ php artisan db:seed
也可以
$ php artisan migrate:refresh --seed
注:开发时尽量不要手动往数据库里写入内容,因为类似于 migrate:refresh 这种操作是很频繁的,如果你想要数据库里有一些数据,请使用数据填充功能。这样做除了能被纳入版本控制以外,另一个好处是能让你不需要依赖数据库里的数据,这在团队协作中尤其重要,因为队友很多时候不是和你使用同一个数据库。希望同学们尽早养成好习惯。
二、 填充话题数据
由于实际项目肯定跟话题的字段不同,这里copy出来也没有必要,知道可以这么用就好了,到时候再查。
版本控制
$ git add -A
$ git commit -m "填充用户和xxx数据...."
5.5 话题列表页面
实际项目不会用到这个列表页面,直接前端UI列表搞定
模型关联vi app/Models/Topic.php
(实际不为Topic)
<?php
namespace App\Models;
class Topic extends Model
{
protected $fillable = [
'title', 'body', 'user_id', 'category_id', 'reply_count',
'view_count', 'last_reply_user_id', 'order', 'excerpt', 'slug',
];
public function category()
{
return $this->belongsTo(Category::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
其他pass
5.6 性能优化
为了能更直观地看到问题,我们先安装 Laravel 开发者工具类 - laravel-debugbar。
1) 安装 Debugbar
$ composer require "barryvdh/laravel-debugbar:~3.2" --dev
$ php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
打开 config/debugbar.php,将 enabled 的值设置为:
'enabled' => env('APP_DEBUG', false),
2) 如何解决 N +1 问题
N+1 一般发生在关联数据的遍历时
通过 Eloquent 提供的 预加载功能 来解决此问题:
vi app/Http/Controllers/TopicsController.php
.
.
.
class TopicsController extends Controller
{
.
.
.
public function index()
{
$topics = Topic::with('user', 'category')->paginate(30);
return view('topics.index', compact('topics'));
}
.
.
.
版本控制
$ git add -A
$ git commit -m "修复 N+1 问题"
5.7 分类下的xxx列表
不一定有这个需求,pass
5.8 xxx列表排序
排序不一定会使用本地作用域,pass
5.9 用户发布的xxx
主要涉及到了一个一对多的模型关联。
5.10 小结
- 如何利用代码生成器快速生成一个模块功能的代码
- 使用数据迁移生成初始化数据;
- 安装 Debugbar来发现
N+1
的问题。 - 如何解决
N+1
的问题(通过 Eloquent 提供的 预加载功能)