Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
276 changes: 273 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,276 @@
# thinkphp6 数据库迁移工具

## 安装
~~~
composer require topthink/think-migration
~~~

```
composer require lingyun/think-migration
```
## 数据库迁移

### 生成迁移文件

```
php think migrate:create AnyClassNameYouWant
```
### 编辑迁移文件

```
<?php

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

class AnyClassNameYouWant extends Migrator
{

public function change()
{
$this->table('user')
->addColumn(Column::string('email')->setUnique())
->addColumn(Column::string('username')->setUnique())
->addColumn(Column::string('avatar')->setNullable())
->addColumn(Column::string('password'))
->addColumn(Column::timestamp('email_verified_at')->setNullable())
->addColumn(Column::string('remember_token', 100)->setNullable())
->addTimestamps()
->create();
}

}
```
### 运行迁移文件

```
php think migrate:run
```
### 回滚迁移文件

```
php think migrate:rollback
```
### 设置迁移断点
`migrate:breakpoint` 命令用来设置断点,可以使你对回滚进行限制。你可以调用 `breakpoint` 命令不带任何参数,即将断点设在最新的迁移脚本上

```
php think migrate:breakpoint

```

可以使用 --target 或者 -t 来指定断点打到哪个迁移版本上

```
php think migrate:breakpoint -t 20120103083322

```
可以使用 --remove-all 或者-r 来移除所有断点


```
php think migrate:breakpoint -r

```
### 查看迁移状态

```
php think migrate:status
```
输出格式:`text` 或者 `json`,默认输出`text`
```
php think migrate:status --format json
```
或者
```
php think migrate:status -f json
```
## 数据填充

### 创建Seeder类

```
php think seed:create UserSeeder
```

`seeder` 类只包含一个默认方法:run。这个方法会在执行 `php think seed:run` 命令时被调用。在 `run` 方法里,你可以根据需要在数据库中插入数据。你也可以用 构造查询器 或 [模型工厂](#模型工厂) 来手动插入数据。

```
<?php

use think\migration\Seeder;

class UserSeeder extends Seeder
{
public function run()
{
//填充一条数据
$this->table('user')->insert([
'username' => 'example1',
'email' => 'example1@qq.com',
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
])->save();

//填充一条数据
$this->insert('user', [
'username' => 'example2',
'email' => 'example2@qq.com',
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
]);
}
}
```
### 运行 Seeders

您可以使用 `php think seed:run` 来填充数据库。默认情况下将运行 `database/seeds` 目录下所有Seeder类,可以使用 `--seed` 选项来指定一个特定的 seeder 类:
```
php think seed:run

php think seed:run --seed=UserSeeder
```

### 使用模型工厂

使用 [模型工厂](#模型工厂) 轻松地生成大量数据库数据。

例如,创建 50 个用户并为每个用户创建关联:
```
<?php

use think\migration\Seeder;

class UserSeeder extends Seeder
{
public function run()
{
$this->factory()->create(User::class); //使用工厂类填充1条数据
$this->factory()->of(User::class)->times(2)->create(); //使用工厂类填充2条数据
$this->factory()->of(User::class, 'example')->create();
}
}
```
## 模型工厂
<a name='模型工厂'></a>


### 创建工厂

要创建工厂,请执行 `php think factory:create` 命令:

```
php think factory:create User
```

新创建的工厂类默认存放在 database/factories 目录下。

```
<?php

use Carbon\Carbon;
use Faker\Generator as Faker;
use think\helper\Str;
use think\migration\Factory;

/** @var Factory $factory */
$factory->define(\app\model\User::class, function (Faker $faker) {
return [
'username' => $faker->unique()->userName,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => Carbon::now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
});
```

以上就是模型工厂的最基本形式,调用 `define` 闭包方法返回伪造的模型属性值集合,该集合会在使用模型工厂创建新的模型实例时应用到模型属性。

通过 `$faker` 参数,可以访问 `Faker PHP` 函数库, 它允许你便捷的生成各种随机数据来进行测试。具体属性和方法请参考`\Faker\Generator`类。

> 技巧:你也可以在 config/app.php 配置文件中添加 faker_locale 选项来设置 Faker 的语言环境。

可以使用 `define` 方法的第三个参数为模型工厂设置名称
```
<?php

use Carbon\Carbon;
use Faker\Generator as Faker;
use think\helper\Str;
use think\migration\Factory;

/** @var Factory $factory */
$factory->define(\app\model\User::class, function (Faker $faker) {
return [
'username' => $faker->unique()->name,
'email' => $faker->unique()->freeEmail,
'email_verified_at' => Carbon::now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}, 'example');

```


### 工厂状态

状态操作方法允许你定义离散修改,可以以任意组合应用于模型工厂。通常调用工厂类提供的 state 方法:

```
<?php

use Faker\Generator as Faker;
use think\migration\Factory;

/** @var Factory $factory */
$factory->state(\app\model\User::class, 'unverified', ['email_verified_at' => null]);
$factory->state(\app\model\User::class, 'unremember', ['remember_token' => null]);

```
同时 也可以使用闭包:
```
$factory->state(\app\model\User::class, 'useFirstName', fn (Faker $faker) => ['username' => $faker->unique()->firstName]);
```

### 使用工厂创建模型

让我们来看看一些创建模型的例子。首先,我们将使用 make 方法来创建模型而不存储到数据库:

```
use app\model\User;

public function test()
{
$factory = app(Factory::class);
$user = $factory->of(User::class)->make(); //通过默认模型工厂创建模型
dump($user);
$user = $factory->of(User::class, 'example')->make();//通过example模型工厂创建模型
dump($user);
// 模型中的其他测试...
}
```
可以使用`times`方法创建一个包含多个模型的集合:

```
app(Factory::class)->of(User::class)->times(3)->make();
```
还可以使用`state`方法应用任意定义的状态到模型类:

```
app(Factory::class)->of(User::class)->state('unverified')->make();
```
如果你想要应用多个状态转化到模型类,可以使用`states`方法:
```
app(Factory::class)->of(User::class)->states('unverified','unremember')->make();
app(Factory::class)->of(User::class)->states(['unverified','unremember','useFirstName'])->make();
```

### 覆盖属性
如果你想覆盖模型的一些默认值,你可以将数组传递给 `make` 方法。只有指定值才会被替换,剩下值保持工厂指定的默认值不变:
```
$user = app(Factory::class)->of(User::class)->make(['username' => 'thinkphp']);
```
### 模型存储

`create` 方法创建模型实例,并使用 `think\Model` 的 `save` 方法其存储到数据库中:
```
$user = app(Factory::class)->of(User::class)->create();
```
> 更多模型工厂用法自行研究
23 changes: 15 additions & 8 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "topthink/think-migration",
"name": "lingyun/think-migration",
"authors": [
{
"name": "yunwuxin",
Expand All @@ -11,7 +11,10 @@
"psr-4": {
"Phinx\\": "phinx/src/Phinx",
"think\\migration\\": "src"
}
},
"files": [
"src/helper.php"
]
},
"extra": {
"think": {
Expand All @@ -22,13 +25,17 @@
},
"require": {
"topthink/framework": "^6.0 || ^8.0",
"topthink/think-helper": "^3.0.3"
"fakerphp/faker": "^1.19"
},
"minimum-stability": "dev",
"suggest": {
"fzaninotto/faker": "Required to use the factory builder (^1.8)."
"fakerphp/faker": "Required to use the factory builde."
},
"require-dev": {
"fzaninotto/faker": "^1.8"
}
}
"fakerphp/faker": "^1.19"
},
"config": {
"sort-packages": true
},
"minimum-stability": "dev",
"prefer-stable": true
}
4 changes: 3 additions & 1 deletion phinx/src/Phinx/Util/Util.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

/**
* Phinx
*
Expand Down Expand Up @@ -26,6 +27,7 @@
* @package Phinx
* @subpackage Phinx\Util
*/

namespace Phinx\Util;

class Util
Expand Down Expand Up @@ -59,7 +61,7 @@ public static function getCurrentTimestamp()
/**
* Gets an array of all the existing migration class names.
*
* @return string
* @return array
*/
public static function getExistingMigrationClassNames($path)
{
Expand Down
Loading