tp8数据迁移migration如何创建一个set类型的列及写入数据

  • 原创
  • 作者:程序员三丰
  • 发布时间:2024-12-24 23:22
  • 浏览量:374
本文介绍ThinkPHP8中数据迁移think-migration如何给数据表创建一个set类型的列,以及数据写入测试示例。

创建migration

首先,要确保在你的tp8项目中已经安装了数据迁移工具think-migration,如果没安装,在项目根目录下执行下面命令:

composer require topthink/think-migration

执行下面的命令,创建一个migration文件,用于后续实践:

# 创建迁移
php think migrate:create CreateUserTable

# 执行成功,并告知迁移文件的路径,控制台显示如下:
created ./database/migrations/20241224005727_create_user_table.php

编辑创建的迁移文件,添加我们要创建一个User表,包含我们需要的set类型的列:

#file: /database/migrations/20241224005727_create_user_table.php

<?php
use think\migration\Migrator;

class CreateUserTable extends Migrator
{
    public function change(): void
    {
        $tableName = 'user';
        if (!$this->hasTable($tableName)) { // 如果 pc_user 表不存在,才创建
            $table = $this->table($tableName, ['collation' => 'utf8mb4_unicode_ci', 'comment' => '用户表']);
            $table->addColumn('username', 'string', ['limit' => 80, 'null' => false, 'default' => '', 'comment' => '姓名'])
                ->addColumn('gender', 'enum', ['values' => ['0', '1'], 'null' => false, 'default' => '1', 'comment' => '性别:0=男,1=女'])
                ->addColumn('mobile', 'string', ['limit' => 80, 'null' => false, 'default' => '', 'comment' => '手机号'])
                ->addColumn('email', 'string', ['limit' => 80, 'null' => false, 'default' => '', 'comment' => 'email'])
                ->addColumn('info', 'text', ['comment' => '个人信息'])
                ->addColumn('skills', 'set', [
                    'null'    => false, 'default' => '',
                    'values'  => ['php', 'java', 'html', 'javascript', 'css', 'vue', 'jquery'],
                    'comment' => '技术栈'
                ])
                ->addColumn('status', 'enum', ['values' => ['0', '1'], 'null' => false, 'default' => '1', 'comment' => '状态:0=正常,1=禁用'])
                ->addColumn('create_time', 'integer', ['limit' => 10, 'null' => true, 'signed' => false, 'default' => null, 'comment' => '创建时间'])
                ->addColumn('update_time', 'integer', ['limit' => 10, 'null' => true, 'signed' => false, 'default' => null, 'comment' => '更新时间'])
                ->create();
        }
    }
}

其中,user表的skill列就是一个set类型的列。

然后执行迁移工具,便会创建user表,表前缀根据你的项目配置而定。

# 执行迁移工具
php think migrate:run

# 执行成功结果如下:
 == 20241224005727 CreateUserTable: migrating
 == 20241224005727 CreateUserTable: migrated 0.0241s

All Done. Took 0.0356s

创建模型

通过命令行创建User模型:

php think make:model User

# 执行成功,并告知模型文件的路径,控制台显示如下:
Model:app\model\User created successfully.

‼️ 重点
由于mysql中set类型比较特殊,其值的存储形式可以理解为是字符串。
但是,set类型的字段在实际应用中一般是多选的情况,前端一般提交的数据都是一个数组,所以在模型中对set类型的字段设置[修改器]和[获取器],这样对set类型字段的数据更新和读取更方便。

编辑User模型文件:

#file: /app/model/User.php

<?php
declare (strict_types=1);

namespace app\model;

use think\Model;

/**
 * @mixin Model
 */
class User extends Model
{
  /**
     * 修改器
     * @param $value
     * @return string
     */
  public function setSkillsAttr($value): string
  {
    return is_array($value) ? implode(',', array_values($value)) : $value;
  }

  /**
     * 获取器
     * @param $value
     * @return array
     */
  public function getSkillsAttr($value): array
  {
    return !empty($value) ? explode(',', $value) : [];
  }
}

测试

使用自定义指令进行测试,先创建一个自定义指令:

php think make:command Debug debug

# 执行成功,并告知创建指令文件的路径,控制台显示如下:
Command:app\command\Debug created successfully.

注意:需要在config/console.php文件中配置上面创建的自定义执行,才能在控制台运行。

#file: config/console.php

return [
    // 指令定义
    'commands' => [
        'debug' => 'app\command\Debug'
    ],
];

此时自定义指令可正常运行了:

php think debug

编辑自定义指令文件,通过User模型创建和更新数据来测试我们通过数据迁移创建的set列是否可正常使用:

● 创建数据记录

#file: app/command/Debug.php

<?php
declare (strict_types=1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use app\model\User;

class Debug extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('debug')
            ->setDescription('the debug command');
    }

    protected function execute(Input $input, Output $output)
    {
        // 创建User记录
        User::create([
            'username' => '三丰',
            'gender'   => '0',
            'mobile'   => '18700001111',
            'email'    => 'skeam-tj@qq.com',
            'info'     => '做好一个程序员',
            'skills'   => ['php', 'javascript', 'vue', 'jquery'],
            'status'   => '1',
        ]);

        // 指令输出
        $output->writeln('执行执行完成。');
    }
}

说明:
skills字段的写入数据格式本文使用的是数组格式,主要是考虑到实际开发中的场景,前端一般会提交一个数组。上文有说明,当然,你可以这样以字符串的形式写:[‘skills’ => ‘php,html,css’],也是可以的。

● 更新数据记录

<?php
declare (strict_types=1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use app\model\User;

class Debug extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('debug')
            ->setDescription('the debug command');
    }

    protected function execute(Input $input, Output $output)
    {
        // 更新User记录
        User::update([
            'skills' => ['java', 'html', 'css'],
        ], ['id' => 1]);

        // 指令输出
        $output->writeln('执行执行完成。');
    }
}

● 读取数据

<?php
declare (strict_types=1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use app\model\User;

class Debug extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('debug')
            ->setDescription('the debug command');
    }

    protected function execute(Input $input, Output $output)
    {
        // 更新User记录
        $datalist = User::select();
        dump($datalist->toArray());

        // 指令输出
        $output->writeln('执行执行完成。');
    }
}

修改你的自定义执行的内容,并执行,然后查看数据库的数据是否正确。

声明:本文为原创文章,51blog.xyz和作者拥有版权,如需转载,请注明来源于51blog.xyz并保留原文链接:https://www.51blog.xyz/article/76.html

文章归档

推荐文章

buildadmin logo
Thinkphp8 Vue3 Element PLus TypeScript Vite Pinia

🔥BuildAdmin是一个永久免费开源,无需授权即可商业使用,且使用了流行技术栈快速创建商业级后台管理系统。

热门标签

PHP ThinkPHP ThinkPHP5.1 Go Mysql Mysql5.7 Redis Linux CentOS7 Git HTML CSS CSS3 Javascript JQuery Vue LayUI VMware Uniapp 微信小程序 docker wiki Confluence7 学习笔记 uView ES6 Ant Design Pro of Vue React ThinkPHP6.0 chrome 扩展 翻译工具 Nuxt SSR 服务端渲染 scrollreveal.js ThinkPHP8.0 Mac webman 跨域CORS vscode GitHub ECharts Canvas