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 提供的 预加载功能)
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会