前面我們建立了資料表,也建立了存取資料庫的物件。
這邊我們要來聊聊
在開發網頁時,除了資料庫的格式是固定的,有時候我們也會需要固定產生一些資料,讓後續的開發和測試更順利。
這時候,我們就可以使用 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:rollback
和 migrate
,如果之前的 migration 都有正確建立,那麼應該可以得到一個架構正確且沒有內容的空資料庫。
之後,透過運作 php artisan db:seed
,我們就可以得到有所有預設內容的資料庫了。
或者,我們可以用更簡潔的
$ php artisan migrate:refresh --seed
這個指令可以一次跑完 migrate:rollback
,migrate
,db:seed
。等於一個指令就可以重建開發用資料庫囉!是不是很方便!
總結一下今天我們所學到的東西。
今天我們學到了 seeder 的概念,怎麼使用 seeder,然後又學到了怎麼透過指令快速的重建開發用資料庫。
希望今天大家有所收穫!我們明天見!
想問$subject = Subject::where('name', '測試主題')->first()
這行程式碼裡面的first()
是什麼意思(舉手)
Subject::where('name', '測試主題')
可能不只有一個符合條件的資料。如果後面接著 get()
會撈出所有符合條件的資料,用 first()
則只會撈出第一筆。
在我們這個範例內,因為我們知道只會有一筆資料,所以是不是第一筆沒有差異,直接用 first()
來保證撈出的是一筆資料即可。
瞭解!
那如果要撈出第二筆呢?