Laravel8+Vue3+Bootstrap5實作TODO List ep03:產生測試資料到資料庫中

Table of Contents

Table of Contents

使用Laravel8+Vue3+Bootstrap5實作TODO List網頁應用程式的系列文章第三篇。
本文將介紹如何使用Factory Seeder Faker來快速產生測試資料到資料庫上。

教學影片

更新資料庫中的todos表

上一次產生的todos表中,completed欄位(用來代表該事項是否完成)的預設值並沒有做任何設定。 正常來說,當新增一項待辦事項時,其狀態應該是未完成的。所以可以把預設值設為false表示未完成,如此可以省去設定的處理。

可以去新增一個migration檔案做修改,但因為還是剛剛建立且沒有任何資料在表裡面,所以我決定重新建立todos表,使用以下指令可以做表的刪除跟新建。

php artisan migrate:refresh

介紹使用make指令來產生需要的檔案

在介紹Factory & Seeder之前,先來看看如何去產生Factory跟Seeder檔案。
如果按照上一篇的方式建立Migration檔案的話,同時也會一併產生出相對應的Factory、Seeder跟Model檔案。
也就是

  • Factory: TodoFactory.php
  • Seeder: TodoSeeder.php
  • Model: todo.php (檔名習慣開頭用大寫字母,所以稍後會去做修改)

順便一提,上一篇中使用的指令為

php artisan make:model todo -a

如果沒有Factory、Seeder跟Model檔案的話,也可以用make的其他指令來產生想要的檔案。
想要查看用make指令能產生的檔案列表的話,可以用下面這個指令來列出。

php artisan list make 

# result:
Available commands for the “make” namespace:
  make:cast          Create a new custom Eloquent cast class
  make:channel       Create a new channel class
  make:command       Create a new Artisan command
  make:component     Create a new view component class
  make:controller    Create a new controller class
  make:event         Create a new event class
  make:exception     Create a new custom exception class
  make:factory       Create a new model factory
  make:job           Create a new job class
  make:listener      Create a new event listener class
  make:mail          Create a new email class
  make:middleware    Create a new middleware class
  make:migration     Create a new migration file
  make:model         Create a new Eloquent model class
  make:notification  Create a new notification class
  make:observer      Create a new observer class
  make:policy        Create a new policy class
  make:provider      Create a new service provider class
  make:request       Create a new form request class
  make:resource      Create a new resource
  make:rule          Create a new validation rule
  make:seeder        Create a new seeder class
  make:test          Create a new test class

Factory & Seeder & Faker

TodoFactory & Faker

TodoFactory的檔案可以在databases/factories/中找到。
編寫的部分為

  • $model變數: 用來指定model
  • definition函數: 用來設計model內的資料

使用Faker這個工具可以很輕鬆地產生隨機的資料。
Laravel8裡已經還有這項工具,透過$this->faker即可使用。

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Todo;

class TodoFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Todo::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'body' => $this->faker->text,
        ];
    }
}

TodoSeeder

run函數可以設定用factory來產生多筆資料並存到資料庫中。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class TodoSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        \App\Models\Todo::factory(10)->create();
    }
}

修改todo.php為Todo.php

由於命名時沒有注意到大小寫,所以這裡把app/Models/下的todo.php改為Todo.php,class名稱也要注意改成Todo
另外TodoController.php有引用App\Model\todo的部分也要記得修改。

修改參考

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Todo extends Model
{
    use HasFactory;
}

TodoController.php的修改。

namespace App\Http\Controllers;

use App\Models\Todo;  // use App\Models\todo;
use Illuminate\Http\Request;

class TodoController extends Controller
...

產生測試資料並添加到資料庫

TodoFactory.phpTodoSeeder.phpTodo.php都完成後,最後就是使用指令將資料建立到資料庫中。
使用的指令如下,

php artisan db:seed --class=TodoSeeder

畫面顯示執行成功後,可以利用PHPMyAdmin的管理畫面去看看資料庫developtodos表裡是否資料已經被產生出來。