先前已经给专栏数据表填充了 10 专栏数据,现在给文章数据表填充点数据,为后续开发做准备。

文章模型

运行以下命令同时生成模型和迁移文件:

  1. php artisan make:model Article -fm

-fm 参数代表同时生成 factory 工厂文件和 migration 数据库迁移文件

打开生成的{timestamp}_create_articles_table.php 文件,修改内容如下:
database/migrations/{timestamp}_create_articles_table.php

  1. <?php
  2. use Illuminate\Database\Migrations\Migration;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Support\Facades\Schema;
  5. return new class extends Migration
  6. {
  7. /**
  8. * Run the migrations.
  9. *
  10. * @return void
  11. */
  12. public function up()
  13. {
  14. Schema::create('articles', function (Blueprint $table) {
  15. $table->id();
  16. $table->unsignedInteger('column_id');
  17. $table->string('title');
  18. $table->string('excerpt');
  19. $table->text('content');
  20. $table->string('slug');
  21. $table->timestamps();
  22. });
  23. }
  24. /**
  25. * Reverse the migrations.
  26. *
  27. * @return void
  28. */
  29. public function down()
  30. {
  31. Schema::dropIfExists('articles');
  32. }
  33. };

字段说明:

字段名称 描述 类型 加索引缘由
id 自增 ID unsigned big int 主键
column_id 该文章所属的专栏 unsigned big int 外键
title 文章标题 string 文章
excerpt 文章摘要,SEO 优化时用 string
content 文章内容 text

文章的数据工厂

打开 ArticleFactory.php 文件,修改内容如下:
database/factories/ArticleFactory.php

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Article>
 */
class ArticleFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        $sentence = $this->faker->sentence();
        return [
            'title' => $sentence,
            'content' => $this->faker->text(),
            'excerpt' => $sentence,
            'column_id' => $this->faker->randomElement([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
        ];
    }
}

sentence() 随机生成『小段落』文本用以填充 title 标题字段和 excerpt 摘录字段。text()方法会生成大段的随机文本,此处我们来填充话题的 content 内容字段。

文章数据填充

使用以下命令生成数据填充文件:

php artisan make:seed ArticlesSeeder

修改文件如以下:
database/seeders/ArticlesSeeder.php

<?php

namespace Database\Seeders;

use App\Models\Article;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class ArticlesSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Article::factory()->count(50)->create();
    }
}

注册数据填充

现在需要修改 DatabaseSeeder.php 文件,在里面添加 ArticlesSeeder 调用:
database/seeders/DatabaseSeeder.php。

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(ColumnsSeeder::class);
        $this->call(ArticlesSeeder::class);
    }
}

调用是按 run() 方法里的顺序由上到下依次调用,先生成专栏数据,再生出文章数据。

执行填充数据命令

一切准备就绪,接下来开始调用数据填充命令,将假数据写入数据库。只需要 10 条测试专栏数据,而之前已经生成了 10 条专栏数据了,所以使用:

php artisan migrate:refresh --seed

执行成功后查看数据库就可以看到,columns专栏表里面有 10 条数据,Articles文章表里面有 50 条数据:
image.png
image.png