Write the Code. Change the World.

9月 06

既然 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 语句去实现,一个比较慢,也比较容易出错。使用工具,就方便稳定多了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注