在建立Model之前我們要完成幾個動作,在前一篇文章有介紹到migration的應用,但是建立好資料表了,但是裡面卻沒有資料,其實對於一個開發者來說,要建立假資料是一個很麻煩的事情,沒資料又不能測試CRUD,我們可以透過 Laravel 提供的 Seeder 類別來新增假資料進去,讓我們可以很方便些。

什麼是 Seeding?

Seed 照翻譯來看是種子,Seeding 就是播種,那在 Laravel 中稱之為假資料,我們需要新增多少假資料,就是靠他了。

Seeder是如何執行?

Seeder 的類別是獨立的,在 專案 > database > seeds > DatabaseSeeder.php 的這個檔案為程式的執行點,裡面所有需要執行的Seeder,統一由這個執行點去做一個管理。

如何建立Seeder檔?

來建一個Member的Seeder,資料表裡的假資料,命名方式一般以
「Model名稱+複數+TableSeeder」。

1
$ php artisan make:seeder MembersTableSeeder

專案 > database > seeds > MembersTableSeeder.php

開啟 MembersTableSeeder.php 的檔案,Laravel 提供的起始程式碼。

起始的原始碼,只會有一個 run 的方法,用artisan執行時,只會執行這個方法。
※ 我們將註解刪除,方便觀看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

use Illuminate\Database\Seeder;

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

新增單筆假資料

當用到Carbon的方法,記得要use他,不然會無法執行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon;

class MembersTableSeeder extends Seeder
{
public function run()
{
DB::table('members')->insert([
'm_account' => 'Ps_0610',
'm_password' => md5('Ab123456'),
'm_name' => '郭小黑',
'm_id' => 'M10001',
'm_email' => 'ya1233456@hotmail.com',
'm_phone' => '02-23781234',
'created_at' => Carbon::now()
]);
}
}

加載 Carbon ,解決讀取不到的問題。

1
$ composer dump-autoload

Carbon參考1:Carbon 時間套件
Carbon參考2:Laravel中日期時間處理包Carbon的簡單使用
Carbon參考3:Class Carbon\Carbon not found
型態相關方法:Laravel 7 官網

密碼的加密技術

執行單一Seeder

使用 --class 執行單一的Seeder

1
$ php artisan db:seed --class=MembersTableSeeder

設定Seeder管理檔案

設定Seeder執行點的檔案,方便未來哪些檔案要執行與不執行。

DatabaseSeeder.php
使用 call 方法 $this->call(seeder檔名稱::class); 執行所需要的Seeder。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

use Illuminate\Database\Seeder;

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

執行多個Seeder

為什麼標題是說執行多個Seeder,原因是因為指令在執行的時候,只執行 專案 > database > seeds > DatabaseSeeder.php 裡面的 DatabaseSeeder 這個class。

1
$ php artisan db:seed

新增多筆假資料

要新增多筆假資料其實就只要外面加上一個for迴圈就可以達到目的,但我為了讓資料有辨識度,在class 外面我寫了三個亂數function,分別用在密碼、姓名、電話三個欄位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon;
use Illuminate\Support\Str;

class MembersTableSeeder extends Seeder
{
public function run()
{
// 一次建立 25 筆資料
for ($i = 1; $i <= 25; $i++) {
DB::table('members')->insert([
'm_account' => 'Ps_061'.$i,
'm_password' => md5(Rand_Password(10)),
'm_name' => Rand_Name(),
'm_id' => 'M1000'.$i,
'm_email' => Str::random(10).'@hotmail.com',
'm_phone' => '02-'.Rand_phone(8),
'created_at' => Carbon::now()
]);
}
}
}

/***
* 產生亂數密碼
* 預設值為8碼
*
* @version 1.0
* @author Black
*
* strlen = 取得字串長度
* substr = 取得部分值
* rand(min,max) = 亂數產生一個值
*
*/
function Rand_Password($length=8){
$passwordChars = '123456789'.'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$password = '';
for ($i = 1; $i <= $length; $i++) {
$RandomNumber = rand(0,strlen($passwordChars));
$password .= substr($passwordChars,$RandomNumber-1,1);
}
return $password;
}

/***
* 產生亂數產生姓名
*
* @version 1.0
* @author Black
*/

function Rand_Name(){
$FirstName = '郭黃林朱蔡劉楊';
$LastName = ['先生','小姐'];
$RandomNumber = rand(0,mb_strlen($FirstName));

$Name = mb_substr($FirstName,$RandomNumber-1,1).$LastName[array_rand($LastName,1)];

return $Name;
}

/***
* 產生亂數號碼
* 預設值為8碼
*
* @version 1.0
* @author Black
*/

function Rand_phone($length=8) {
$Phone_number = '';
for ($i = 1; $i <= $length; $i++) {
$random_number = rand(0,9);
$Phone_number .= $random_number;
}
return $Phone_number;
}

PHP 註解規則使用方式
[ PHP ] – 利用亂數取的隨機的英數字帳號

各種SQL語法

清除資料表資料

1
DB::table('members')->delete();

MySQL語法

1
TRUNCATE TABLE `members`;

指令操作

1
$ php artisan migrate:refresh

新增資料

1
2
3
4
DB::table('members')->insert([
'key' => 'value',
'key2' => 'value'
]);

資料表歸零重新計算

1
ALTER TABLE `members` AUTO_INCREMENT =0;

結論

其實我們在散播種子的之前,可能需要將種子的結構去做好,才有辦法將種子播種出去,所以在做假資料內容的時候,需要把呈現的資料內容做個處理,再去做產生,才會達到資料的一致性,Laravel 提供這個功能其實造福各開發者,但可能還有些麻煩之處,但下一章節會介紹Factory快速產生假資料。

標籤: w3HexSchool PHP Laravel