Thinkphp5.0的migration使用方法
文章主要介绍了在Laravel和ThinkPHP5.0中如何使用Migration来创建数据库表。首先,提到了新版本的Thinkphp引入了Migration,但需要手动引入。接着,建议不会composer的用户直接下载官方完整包或学习如何使用composer。然后,强调在使用Migration之前引入一个包,这对测试数据很有帮助,而TP官方手册并未提及这一点。接下来,详细介绍了如何通过命令行执行Migration来创建表,并提供了详细的使用方法参考。最后,解释了如何自动填充数据,类似于Laravel的ModelFactory。

用过Laravel的朋友可能都知道Migration是个很好用的东西,新版的Thinkphp5.0也引入了这一方式,不过需要大家手动引入

composer require topthink/think-migration 

如果还不会composer的同学建议直接下载官方完整包或者去学习下如何使用composer 很好的官方中文教程 http://www.kancloud.cn/thinkphp/composer
在thinkphp中使用migration之前我建议大家在引入一个包,在做测试数据的时候会很有用的,这一点TP官方手册上根本没有提起,

composer require fzaninotto/faker

具体来说这个包是填充数据用的配合Thinkphp中的Seed来使用

好了言归正传 migration怎么使用呢,直接上代码 在命令行下执行

php think migrate:create ArticleMigration
//命名规则驼峰法+Migration
//如果是中间表会自动转换成下划线
//如:
php think migrate:create ArticlesTagsMigration
//这样生成的表就是articles_tags

有关于Migration的详细使用方法可以参照 http://docs.phinx.org/en/latest/intro.html
不过是英文的,创建好文件后会在根目录database目录下生成一个migration文件内如大概如下:

<?php

use Phinx\Migration\AbstractMigration;

class ArticlesMigration extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change(){
        
    }
}

不过用这个方法建成的表不能进行回滚操作等方法,官方建议使用up 和 down 方法也就是变成下面的方式

<?php

use Phinx\Migration\AbstractMigration;

class ArticlesMigration extends AbstractMigration
{
    
    public function up()
    {
        $table= $this->table('articles');
        $table->addColumn('title','string')
            ->addColumn('content','text')
            ->addColumn('category_id','integer')
            ->addColumn('user_id','integer')
            ->addTimestamps()
            ->addIndex(['title'],['unique'=>true])
            ->addForeignKey('category_id','category')
            ->addForeignKey('user_id','users')
            ->create();
    }

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

这就是一个具体的创建表的例子,至于具体的表字段的类型还请大家自己参考上面的文档.

下面说下如何自动填充数据

大概这个可以理解为Laravel的ModelFactory吧
新建一个seed

php think seed:create Articles 

同样文件生成在database目录seeds下

<?php

use Phinx\Seed\AbstractSeed;

class Articles extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeders is available here:
     * http://docs.phinx.org/en/latest/seeding.html
     */
    public function run()
    {
            $users_id = \app\common\model\User::column('id');
            $category_id= \app\common\model\Category::column('id');
            $fake = Faker\Factory::create();
            $data = [];
            for ($i=0;$i<10;$i++){
            $data[] =[
                'title'=>$fake->sentence,
                'content'=>$fake->paragraph,
                'category_id'=>$fake->randomElement($category_id),
                'user_id'=>$fake->randomElement($users_id),
                ];
            }
        $this->insert('articles',$data);
    }
}

之需要在run()方法内写好规则在命令行下执行

php seed:run Article

数据库就会自动填充规则所需要的数据了

$fake = Faker\Factory::create();
// 这就是文章最开始要大家引入的另外一个包
// 不然都是要大家手动去填写数据,关于fake大家可以自行百度一下如何使用
咻兔哔
咻兔哔·2020年1月17日

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处

推荐文章

构建现代化个人博客系统:技术亮点与创新实践
后端技术

构建现代化个人博客系统:技术亮点与创新实践

本文介绍了作者构建现代化个人博客系统的技术选型、架构设计和创新实践。核心亮点包括采用Go+Nuxt.js+Vue3技术栈,实现高性能、可扩展的博客平台;创新功能如AI智能摘要生成系统、高性能全文搜索、现代化文件上传系统;微服务化架构、容器化部署及多层次安全防护;性能优化策略如缓存策略、数据库优化和前端性能优化。此外,还展示了智能简历模块、Waline评论系统及多主题支持等特色功能,系统性能指标优异。作者分享了技术收获与未来规划,旨在帮助全栈开发者提升技术能力。

12月10日16
本站更换了新的技术栈
后端技术

本站更换了新的技术栈

本文介绍了基于Go+Nuxt.js+Vue3技术栈构建的现代化个人博客系统。该系统采用微服务架构,包含前台展示、后台管理和API服务三大模块,支持容器化部署,具备高性能与高可用性。后端使用Go、Gin、GORM等技术,前端采用Nuxt.js+Vue3+TailwindCSS,并集成AI智能摘要生成、全文搜索、文件上传等核心功能。系统注重安全设计,实施JWT认证、XSS防护等措施,同时通过Redis缓存、CDN加速等策略优化性能。整体架构展示了现代Web开发的最佳实践,为同类项目提供参考价值。

12月10日14
Gorm格式化时间输出的另一种实现
后端技术

Gorm格式化时间输出的另一种实现

Gorm在读取时间时默认带有时区,不符合常规的日期格式。本文提出了一种通过自定义结构体和使用Gorm的Hook方式来解决这个问题。作者首先定义了一个只包含时间字段的结构体,并使用`Str`后缀和`json`标签来指定时间字段只参与存储而不参与数据输出。接着,通过Gorm的Hook机制实现时间字段的格式化。虽然这种方法不是特别高明,但确实提供了一种有效的解决方案。

7月22日17
Golang三方库收集-不定期更新
后端技术

Golang三方库收集-不定期更新

以下是一些热门的第三方库,包括网络请求库、RPC库、Web框架、热重启库、定时任务库、获取机器状态库、JWT库、验证码库、邮件库、汉字转拼音库、消息队列库、随机数库、Redis客户端库、雪花 ID 生成器库、Excel处理库、WEB框架库、数据库库、配置库、REDIS库、工具包库、参数验证库、日志库、JSON库、协程池库和类型转换库。这些库各有特色,适用于不同的开发场景,值得一试。

7月28日7