首先,要确保在你的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('执行执行完成。');
}
}
修改你的自定义执行的内容,并执行,然后查看数据库的数据是否正确。