本书未发布

37. 数据迁移

未匹配的标注

简介

在本章里,我们将完成用户注册、登录、退出和重置密码功能开发,在本节里我们首先完成注册用户信息表 ( user )的创建。

需求分解

目前常见的网站用户注册方式有邮箱注册、手机注册和第三方授权注册(如QQ/微信或支付宝账号授权注册等),一些大型网站通常支持多种方式注册。因为邮箱注册目前在国内已不太流行、第三方授权注册先要申请第三方应用授权并在授权时填写网站注册回调 URL 这种方式本地开发和测试比较麻烦,而手机注册在国内网站已经成为主流或默认注册方式,所以本书主要介绍通过手机注册功能的实现。

首先,在本教程里,我们要求注册用户包含:昵称、手机号码、登录密码、头像和个人简介这五项信息。但用户用手机注册时,我们仅要求用户填写昵称、有效的手机号码和登录密码,其中手机号码和登录密码是作为用户登录系统的验证凭证。因为头像和个人简介这两项信息在用户注册时我们不需要用户填写,所以我们把这两项信息完善安排到第四章编辑个人资料时再完成。

在本节里,我们只需要完成使用 数据库迁移工具 创建好用户表,功能开发我们从下一节开始介绍。

依赖扩展包

遵循开发规范 ,我们使用 数据库迁移工具 来管理本项目数据库表的更新。不过因为 Tpadmin 也依赖 topthink/think-migration ,在安装 tpadmin 时已经把扩展包 topthink/think-migration 安装到本项目里,所以我们不需要再安装该扩展包了。

在安装时需要注意的是官方文档里写的安装版本是 2.0.(即2.0-2.1之间版本),但通过查看该扩展包代码库版本我们发现并没有 2.版本,所以我们在这里安装 3.0.* 版本:

$ composer require topthink/think-migration=3.0.*

数据字典

下面是注册用户信息表( user )的数据字典。

字段名称 描述 字段类型 默认值 索引说明 其他
name 用户名 字符串 空字符串 不需要 最大长度50
mobile 手机号码 字符串 空字符串 唯一索引 最大长度11
password 登录密码 字符串 空字符串 不需要 最大长度60,加密保存
avatar 头像图片路径 字符串 空字符串 不需要
introduction 个人简介 字符串 空字符串 不需要

字段说明:

  • 因为『手机号码』是用户登录凭证字段,所以我们给字段添加了唯一索引;
  • 遵循『应该 为索引、字符串或整数字段指定一个合理的默认值』规范,我们把每个字符串字段默认值设置成了空字符串('');
  • 遵循『每个表 必须 有创建时间( create_time ) 和 更新时间 (update_time),并且这两个字段 必须 是整型( int )』规范,在本项目所有数据表创建时我们都会添加上这两个时间戳字段所以在字典表格里就不再列出,在之后的数据字典里我们也不列出。

迁移文件

安装完数据库迁移工具迁移扩展包之后,我们在项目根目录执行 php think 命令时,我们会看到一组以migrate开头的命令行。这些以 migrate: 开头的命令行就是用来管理数据库表迁移命令。

迁移命令 用途 说明
migrate:create 创建迁移文件 迁移文件的名称规则和PHP类名相同——即驼峰法命名
migrate:run 执行迁移文件 按迁移文件名里的时间戳大小正序执行项目里所有未执行的迁移文件里的 changeup 方法
migrate:rollback 回滚迁移文件 执行迁移文件里 down 方法定义的操作或与 change 方法相反的操作,回滚命令默认每次是按照 migrations 表里的记录回滚最后一个执行的迁移文件,但可以通过参数 -t/-d 指定回滚文件个数或命名规则
migrate:status 迁移执行状态 查看项目所有迁移文件执行状态
migrate:breakpoint 迁移断点 设置断点调试迁移文件执行信息

以上是笔者整理的一些迁移命令介绍信息,通常我们在项目开发中使用最多的是 migrate:createmigrate:run 这两个命令。因为使用数据迁移命令的 最好习惯 是每次修改数据库表都是新建个迁移文件来完成操作,不要修改已有的迁移文件,所以 migrate:rollback 这个命令在开发过程中也很少使用,其它两个命令在开发时基本不会使用。

下面我们来生成创建 user 表的迁移文件:

$ php think migrate:create CreateTableUser

-- 截图 --

在编辑器里打开上面命令行工具生成的名为 database/migrations/xxxxxxxxxxxx_create_table_user.php 格式的文件,把文件代码替换成以下代码。

database/migrations/xxxxxxxxxxxx_create_table_user.php

<?php

use think\migration\Migrator;
use think\migration\db\Column;

class CreateTableUser extends Migrator
{
    public function up()
    {
        $table = $this->table('user',array('engine'=>'InnoDB'));
        $table->addColumn('name', 'string', array('limit' => 50, 'default' => '', 'null' => false, 'comment' => '用户名'))
            ->addColumn('mobile', 'string', array('limit' => 11, 'default' => '', 'null' => false, 'comment' => '注册手机'))
            ->addColumn('password', 'string', array('limit' => 60, 'default' => '', 'null' => false, 'comment' => '登录密码'))
            ->addColumn('avatar', 'string', array('default' => '', 'null' => false, 'comment' => '用户头像'))
            ->addColumn('introduction', 'string', array('default' => '', 'null' => false, 'comment' => '个人介绍'))
            ->addColumn('create_time', 'integer', array('default' => 0, 'signed' => false, 'null' => true))
            ->addColumn('update_time', 'integer', array('default' => 0, 'signed' => false, 'null' => true))
            ->addIndex(['mobile'], ['unique' => true])
            ->save();
    }

    public function down()
    {
        $this->dropTable('user');
    }
}

代码解读

  • 无论我们在 .env 文件里给数据库表前缀( DB.PREFIX )设置什么值,在迁移文件里写数据库表名时 不需要 带上该前辍值,迁移命令执行时会自动给创建数据库表名加上前缀;
  • 在迁移文件里,我们通常把所有字段的 null 属性值设置成 false 来避免为该字段插入 NULL 值。

接下来,我们执行 migrate:run 命令完成 user 表的创建:

$ php think migrate:run

效果预览

我们使用数据库视图管理工具确认一下创建的数据库表是否和数据字典一致。因为笔者在 .env 文件里配置的 DB.PREFIX 值是 _bbs,所以迁移命令生成的所有表剪辑都是 _bbs

知识点

上面我们已经完成了注册用户信息表( user )的创建,但在这里还有几个问题我们需要给大家说一下。

  • 编写迁移文件时有 changeup/down 两种写法,开发过程中我们使用 up/down 这种写法是因为通常情况下 changeup/down 两种写法的执行结果等同。 但两种写法有以下区别:

    1. 当使用 change 方法写创建数据库表命令执行回滚时只是把数据库表除 id 字段以外的其它字段删除,而不会删除数据库表;
    2. 如果我们创建迁移文件的目地是删除表或字段,使用 change 写的文件回滚时无法添加或重新创建数据库表。
  • user 表创建成功后为什么会比『数据字典』多一个 id 字段?使用迁移命令创建数据表时,命令行默认为会数据表添加一个名为 id 的主键字段,虽然我们可以在迁移文件里通过指定参数不让添加 id 字段,但笔者建议大家还是保持默认操作不要删掉这个字段。

Git提交代码

让我们先保存本节完成的功能,然后再开始后面的开发吧:

$ git add -A
$ git commit -m '创建用户模型的数据表'

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~