iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
3
Modern Web

Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!系列 第 14

[Day 14] 在開發時加入資料!聊 database seeder

  • 分享至 

  • xImage
  •  

前面我們建立了資料表,也建立了存取資料庫的物件。

這邊我們要來聊聊

什麼是 seeder

在開發網頁時,除了資料庫的格式是固定的,有時候我們也會需要固定產生一些資料,讓後續的開發和測試更順利。

這時候,我們就可以使用 seeder 的功能,保證每個人拿到的測試資料都是正確的。

建立 seeder

我們來嘗試建立一個給 Post 的 seeder

$ php artisan make:seeder PostTableSeeder
Seeder created successfully.

建立之後,範例程式碼長這樣

<?php

use Illuminate\Database\Seeder;

class PostTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

我們加入新增資料的程式碼

<?php

use App\Post;
use Illuminate\Database\Seeder;

class PostTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $post = new Post;
        $post->content = 'Laravel 6.0 demo';
        $post->subject_id = 0;
        $post->save();
    }
}

接著,我們運作這個 seeder

$  php artisan db:seed --class=PostTableSeeder
Database seeding completed successfully.

如果順利的話,就可以成功在資料庫裡面看到新建的內容囉!

 改變一下資料

這樣雖然不錯,但是如果我們在不同的資料表內,有很多不同的資料要建立,那豈不是還要輸入好幾次指令嗎?

幸好,不需要這樣處理!

我們依照上面的流程,先建立 SubjectTableSeeder

php artisan make:seeder SubjectTableSeeder
Seeder created successfully.

內容則改寫為

<?php

use App\Subject;
use Illuminate\Database\Seeder;

class SubjectTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $subject = new Subject;
        $subject->name = '測試主題';
        $subject->save();
    }
}

接著,我們改寫一下 PostTableSeeder,產生 10000 個內容,並且都設定為測試主題

<?php

use App\Post;
use App\Subject;
use Illuminate\Database\Seeder;

class PostTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $subject = Subject::where('name', '測試主題')->first();
        for ($index = 0; $index < 10000; $index++) {
            $post = new Post;
            $post->content = 'Laravel 6.0 demo';
            $post->subject_id = $subject->id;
            $post->save();
        }
    }
}

接著,最重要的一個步驟來了!我們要讓 Laravel 內建的 DatabaseSeeder,依照順序呼叫這兩個 seeder

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
        $this->call(
            [
                SubjectTableSeeder::class,
                PostTableSeeder::class,
            ]
        );
    }
}

成功囉!運作看看是不是符合我們的預期!

$ php artisan db:seed
Seeding: SubjectTableSeeder
Seeding: PostTableSeeder
Database seeding completed successfully.

看起來非常順利!

清理髒資料

測試過程中,相信讀者會發現,在開發中資料庫內的內容逐漸變得有點難以控制。

沒關係!Laravel 提供了非常方便的指令,可以快速清理這些舊資料!

我們先運作

$ php artisan migrate:refresh

這個指令基本上是同時運作了 migrate:rollbackmigrate,如果之前的 migration 都有正確建立,那麼應該可以得到一個架構正確且沒有內容的空資料庫。

之後,透過運作 php artisan db:seed,我們就可以得到有所有預設內容的資料庫了。

或者,我們可以用更簡潔的

$ php artisan migrate:refresh --seed

這個指令可以一次跑完 migrate:rollbackmigratedb:seed。等於一個指令就可以重建開發用資料庫囉!是不是很方便!


總結一下今天我們所學到的東西。

今天我們學到了 seeder 的概念,怎麼使用 seeder,然後又學到了怎麼透過指令快速的重建開發用資料庫。

希望今天大家有所收穫!我們明天見!


上一篇
[Day 13] 幫文章加上標籤!聊多對多關係
下一篇
[Day 15] 終於講到 6.0 的改變了!來看 Laravel LazyCollection
系列文
Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Nighteye1228
iT邦新手 5 級 ‧ 2019-09-17 11:54:21

想問$subject = Subject::where('name', '測試主題')->first()這行程式碼裡面的first()是什麼意思(舉手)

ReccaChao iT邦研究生 5 級 ‧ 2019-09-17 22:58:37 檢舉

Subject::where('name', '測試主題') 可能不只有一個符合條件的資料。如果後面接著 get() 會撈出所有符合條件的資料,用 first() 則只會撈出第一筆。

在我們這個範例內,因為我們知道只會有一筆資料,所以是不是第一筆沒有差異,直接用 first() 來保證撈出的是一筆資料即可。

瞭解!

BeEvil_Y iT邦新手 4 級 ‧ 2021-10-01 12:00:18 檢舉

那如果要撈出第二筆呢?

我要留言

立即登入留言