既然 go 的迁移、seeder 等不好用,还是用 laravel 来搞吧。
开始
composer create-project laravel/laravel youme.com --prefer-dist
这样就创建了一个最新的 laravel 项目,项目文件在 youme.com 里。在本地,做了 host 映射。通过 youme.com 就可以打开。
上边就是默认的。
创建 git 版本控制,提交。
git init -b main
git add .
git commit -m 'laravel initialize'
创建模型、迁移、seeder,执行迁移,seeder
现在 laravel 就是个工具人。开始创建模型。创建模型的时候,会把迁移也一块创建了。goframe 最终只是需要数据表,也就是迁移后的玩意。搞模型和seeder,一方面也可以使用 tinker 做些测试和数据的填充。
框架默认已经建了 user 模型和对应的迁移、factory、seeder。我们一一修改成自己想要的。
这里就先把 user 迁移中的字段修改一下。注意看,表名已经从复数(users)改成单数了。模型中就需要手动来指定表名呢。laravel 默认是复数的表名的,不手动指定,就找不到表了。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
// 用户表
public function up(): void
{
Schema::create('user', function (Blueprint $table) {
$table->id();
$table->string('passport', 32)->nullable()->unique();
$table->string('phone', 11)->nullable()->unique();
$table->string('email', 64)->nullable()->unique();
$table->string('password');
$table->string('nickname');
$table->string('avatar')->nullable()->comment('头像');
$table->unsignedTinyInteger('gender')->default(0)->comment("性别 0 未知 1 男 2 女");
$table->string('signature')->nullable()->comment('签名');
$table->timestamp('email_verified_at')->nullable();
$table->rememberToken();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('users');
}
};
对应的模型修改。
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
protected $table = 'user';
protected $fillable = ['passport', 'phone', 'email', 'password', 'nickname', 'avatar', 'gender', 'signature', 'email_verified_at'];
protected $hidden = ['password','remember_token'];
protected $casts = ['email_verified_at' => 'datetime', 'password' => 'hashed'];
}
factory 修改。
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;
class UserFactory extends Factory
{
public function definition(): array
{
return [
'passport' => fake()->unique()->word(),
'phone' => fake()->unique()->phoneNumber(),
'email' => fake()->unique()->safeEmail(),
'password' => Hash::make('password'),
'nickname' => fake()->name(),
'avatar' => fake()->imageUrl(100, 100),
'gender' => random_int(1,2),
'signature' => fake()->sentences(1, true),
'email_verified_at' => now(),
'remember_token' => Str::random(10),
];
}
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}
最后创建一个 seeder,不使用默认的 databaseseeder 了。
php artisan make:seeder UserSeeder
# INFO Seeder [database/seeders/UserSeeder.php] created successfully.
完善 UserSeeder。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\User;
class UserSeeder extends Seeder
{
public function run(): void
{
// 创建 10 个用户
User::factory(10)->create();
}
}
到此 model,factory,seeder 都好了。只需要配置好数据库,执行迁移就完事了。
配置数据库,修改 .env 文件。
vim .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=go-simple-admin
DB_USERNAME=homestead
DB_PASSWORD=secret
因为 fake 默认语言使用的是 en。在 config/app.php 中,将默认语言设置成中文。
'faker_locale' => 'zh_CN',
一切都已就绪。执行迁移和seeder吧。如果之前已经执行过迁移,直接执行 seeder 就可以。
php artisan migrate:fresh
php artisan db:seed --class=UserSeeder
这样,就执行了整个数据库的回滚,以及 10 个用户的创建了。
可以用 tinker 看看。
php artisan tinker;
> clear
> User::count();
= 10
> User::first();
= App\Models\User {#6274
id: 1,
passport: "autem",
phone: "14750351771",
email: "officiis.quidem@example.net",
#password: "$2y$10$/viKJp3/pz7ye8MPj4qIheLsdJnNUuMEN/hUAR121TlWzvEXYn8Xi",
nickname: "房全安",
avatar: "https://via.placeholder.com/100x100.png/00ff44?text=blanditiis",
gender: 2,
signature: "Non nobis nulla quae et magnam.",
email_verified_at: "2023-09-06 06:49:48",
#remember_token: "3ZwYAAIDtu",
created_at: "2023-09-06 06:49:49",
updated_at: "2023-09-06 06:49:49",
}
> User::query()->select(['id', 'nickname', 'phone', 'gender'])->limit(5)->get()->toArray();
= [
[
"id" => 1,
"nickname" => "房全安",
"phone" => "14750351771",
"gender" => 2,
],
[
"id" => 2,
"nickname" => "卞楠",
"phone" => "17006799363",
"gender" => 2,
],
[
"id" => 3,
"nickname" => "靳涛",
"phone" => "15629006400",
"gender" => 2,
],
[
"id" => 4,
"nickname" => "奚帆",
"phone" => "13539355823",
"gender" => 1,
],
[
"id" => 5,
"nickname" => "车瑞",
"phone" => "13278887051",
"gender" => 2,
],
]
>
提交版本控制。
git add .
git commit -m ' 修改 user 模型迁移等'
末了
这么做,只是在说通过这种方式来创建以及维护表很方便,也很稳定。迁移可以执行全部回滚,单步回滚,还可以执行 seeder 来填充数据。
# 只创建模型
php artisan make:model Topic
# 创建模型的同时,创建迁移
php artisan make:model Topic -m
# 创建模型的同时,创建迁移还有控制器
php artisan make:model Topic -m -c
# 也可以单独创建迁移
php artisan make:migrate add_user_table
# 执行迁移
php artisan migrate
# 执行回滚
php artisan migrate:rollback
# 按步骤执行回滚
php artisan migrate:rollback --step=1
# 删除所有的表,并执行迁移
php artisan migrate:fresh
# 先回滚再迁移(我一般不咋用,回滚之后,自增还在,不干净。还不如删除所有表,重新迁移的好)
php artisan migrate:refresh
这里只列了一部分常用的命令。还有很多很多命令在等着呢。对于做项目,本地、测试服、正式服等多种环境。数据库的表截断,回滚等操作都是常用的。如果依靠 sql 语句去实现,一个比较慢,也比较容易出错。使用工具,就方便稳定多了。