最近面試很多間公司,很感謝願意給我機會的公司,但是或許我自己能力不足讓很多公司覺得自己不是被需要的人才,但我相信會有公司願意給我機會發展及一起奮鬥。

什麼是 Factory?

Factory 直接翻譯起來就是工廠,但Laravel Factory 也是跟上一章節所提到的Seeder一樣,可以自動幫你產生假資料,要建多少筆資料及有哪些資料內容的格式一併提供。

如何建立 Factory?

當你建立工廠的時候,一定要有原料、機器、人,也就是Laravel、Faker、開發者。

步驟一

建一個 Member 的 Factory,命名方式以「Model名稱+Factory」。

1
$ php artisan make:factory MemberFactory --model=Member

下方只有建立 factory ,必須手動修改對應的Model類別,以免再做假資料的時候會對應不到東西。

1
$ php artisan make:factory MemberFactory


步驟二

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

專案 > database > factories > MemberFactory.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Member;
use Faker\Generator as Faker;

$factory->define(Member::class, function (Faker $faker) {
return [
//
];
});

以下我們使用 Faker 提供的Library,裡面已經寫好不同的型態別及各種隨機的資料內容,將我們所需的欄位放置符合的假資料方法。

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

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Member;
use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(Member::class, function (Faker $faker) {

return [
'm_account' => Str::random(10),
'm_password' => md5($faker->password),
'm_name' => $faker->name,
'm_id' => 'M10001',
'm_email' => $faker->unique()->safeEmail,
'm_phone' => $faker->tollFreePhoneNumber,
'created_at' => now()
];
});

Table of Contents(Faker 資料表的假資料對應內容) - fzaninotto

步驟三

使用 artisan 指令啟動 tinker

1
$ php artisan tinker

產生單筆假資料

1
>>>  factory(App\Member::class)->make()
1
2
3
4
5
6
7
8
9
=> App\Member {#3067
m_account: "LwvwCaUtPL",
m_password: "f06992f4188f0bb146057ed4175ee57e",
m_name: "Leta Kessler",
m_id: "M10001",
m_email: "fhauck@example.com",
m_phone: "888-858-4447",
created_at: "2020-06-21 14:15:56",
}

產生10筆假資料,這時候還沒寫進資料庫

1
>>> factory(App\Member::class, 10)->make();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
=> Illuminate\Database\Eloquent\Collection {#3064
all: [
App\Member {#3063
m_account: "xX16zIqQOU",
m_password: "0522e328e39824320ec367e150df5976",
m_name: "Maegan Feil III",
m_id: "M10001",
m_email: "anibal.feeney@example.org",
m_phone: "(866) 570-7082",
created_at: "2020-06-21 14:17:03",
},
App\Member {#3065
m_account: "GykPfUA4Ip",
m_password: "fcb8d7b8ee2eed68ead84ec99fa50874",
m_name: "Alaina Grant",
m_id: "M10001",
m_email: "vlemke@example.org",
m_phone: "855.812.4750",
created_at: "2020-06-21 14:17:03",
},
App\Member {#3062

...... 省略

產生10筆假資料並寫入資料庫

1
>>> factory(App\Member::class, 10)->create();

如何用Seeder去搭配Factory?

我們可以省略上面的第三步驟,開啟 MembersTableSeeder.php 的檔案,使用factory方法建立10筆會員假資料。

專案 > database > seeds > MembersTableSeeder.php

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

use Illuminate\Database\Seeder;

class MembersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// 產生10筆假資料
factory(App\Member::class, 10)->create();
}
}

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

專案 > database > seeds > DatabaseSeeder.php

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

use Illuminate\Database\Seeder;

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

執行Seeder

1
$ php artisan db:seed
1
2
3
Seeding: MembersTableSeeder
Seeded: MembersTableSeeder (0.04 seconds)
Database seeding completed successfully.

回資料庫看,就會看到剛剛產生的10筆資料。

什麼是Tinker

使用Laravel 框架在開發的時候,為了縮短開發時程及測試的需求,因此 Laravel artisan 提供了 tinker 的功能,可以有效縮短我們在做專案程式的測試。

Tinker 是一個 REPL(Read-Eval-Print-Loop 交互式命令行界面),只需要輸入指令(command),會將執行結果輸出在cli(命令介面)。

使用 artisan 指令啟動 tinker

1
$ php artisan tinker

建立一個虛擬的文件,將Member資料表對應的Model做產生物件。

1
>>> $Member = new App\Member;

以下指令方式,新增一筆會員的假資料,將會員資料表所需的欄位做對應建立。

1
2
3
4
5
6
7
8
9
10
11
12
>>> $Member->m_account = 'Sn_1011';
=> "Sn_1011"
>>> $Member->m_password = md5('Ab123456');
=> "a0a475cf454cf9a06979034098167b9e"
>>> $Member->m_name = '郭小黑';
=> "郭小黑"
>>> $Member->m_id = 'M00002';
=> "M00002"
>>> $Member->m_email = 'ya123456@gmail.com';
=> "ya123456@gmail.com"
>>> $Member->m_phone = '02-2201123';
=> "02-2201123"

將資料存取到資料庫中,回應結果如果是true,代表存取成功。

1
>>> $Member->save();
1
=> true

查看資料表,確認資料表有無存取到資料表中。

查看剛剛存取的資料表欄位資料。

1
>>> print_r($Member->toArray());
1
2
3
4
5
6
7
8
9
10
11
12
13
Array
(
[m_account] => Sn_1011
[m_password] => a0a475cf454cf9a06979034098167b9e
[m_name] => 郭小黑
[m_id] => M00002
[m_email] => ya123456@gmail.com
[m_phone] => 02-2201123
[updated_at] => 2020-06-21T08:30:51.000000Z
[created_at] => 2020-06-21T08:30:51.000000Z
[id] => 51
)
=> true

刪除資料

刪除id等於1的用戶

1
2
3
4
5
6
>>> $Member = App\Member::find(1);
>>> $Member->delete();

or

>>> App\Member::find(1)->delete();
1
=> true

刪除所有資料

1
>>> App\Member::truncate();
1
=> Illuminate\Database\Eloquent\Builder {#3036}

尋找資料

找尋第二筆資料

1
2
3
4
5
>>> $Member = App\Member::find(2);

or

>>> App\Member::find(2);
1
2
3
4
5
6
7
8
9
10
11
=> App\Member {#4029
id: 2,
m_account: "CTuHvmeZ7h",
m_password: "d2859fe5dd5365d11f96124c041f511e",
m_name: "Dr. Adella Corkery",
m_id: "M10001",
m_email: "mkoepp@example.com",
m_phone: "877-342-1598",
m_login_time: null,
created_at: "2020-06-21 14:19:22",
updated_at: "2020-06-21 14:19:22",

找尋資料欄位的某筆資料
※ m_name欄位:Clay Schmidt

1
2
3
4
5
>>> $Member = App\Member::where('m_name','Clay Schmidt')->first();

or

>>> App\Member::where('m_name','Clay Schmidt')->first();
1
2
3
4
5
6
7
8
9
10
11
12
=> App\Member {#4021
id: 7,
m_account: "vgHiTpevtB",
m_password: "28e4d09e539764b5317277fb1c47e6e1",
m_name: "Clay Schmidt",
m_id: "M10001",
m_email: "lauretta40@example.org",
m_phone: "(877) 665-7758",
m_login_time: null,
created_at: "2020-06-21 14:19:22",
updated_at: "2020-06-21 14:19:22",
}

找尋id等於2的資料

1
2
3
4
5
>>> $Member = App\Member::whereId(2)->first();

or

>>> App\Member::whereId(2)->first();
1
2
3
4
5
6
7
8
9
10
11
12
=> App\Member {#4021
id: 2,
m_account: "CTuHvmeZ7h",
m_password: "d2859fe5dd5365d11f96124c041f511e",
m_name: "Dr. Adella Corkery",
m_id: "M10001",
m_email: "mkoepp@example.com",
m_phone: "877-342-1598",
m_login_time: null,
created_at: "2020-06-21 14:19:22",
updated_at: "2020-06-21 14:19:22",
}

修改資料

修改第一筆資料,將會員名字改成Black。

1
>>> $Member = App\Member::find(2);
1
2
3
4
5
6
7
8
9
10
11
12
=> App\Member {#3081
id: 2,
m_account: "CTuHvmeZ7h",
m_password: "d2859fe5dd5365d11f96124c041f511e",
m_name: "Dr. Adella Corkery",
m_id: "M10001",
m_email: "mkoepp@example.com",
m_phone: "877-342-1598",
m_login_time: null,
created_at: "2020-06-21 14:19:22",
updated_at: "2020-06-21 14:19:22",
}
1
>>> $Member->m_name = 'Black';
1
=> "Black"
1
>>> $Member->save();
1
=> true

計算筆數

計算我們資料表內的筆數

1
>>> App\Member::count();
1
=> 10

列出資料表的所有資料

檢視會員資料表內所有新增的資料

1
>>> App\Member::all();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
=> Illuminate\Database\Eloquent\Collection {#4020
all: [
App\Member {#3773
id: 1,
m_account: "l9IvCOtVPO",
m_password: "afa8d6cb33c2f43eca03c3cfe38f0269",
m_name: "Jaqueline Bernhard",
m_id: "M10001",
m_email: "kris.mante@example.org",
m_phone: "844.363.4332",
m_login_time: null,
created_at: "2020-06-21 14:19:22",
updated_at: "2020-06-21 14:19:22",
},
App\Member {#4021
id: 2,

...省略

※ 將 en_US 改成 zh_TW,再產生假資料的時候可以取得中文的假資料,但部分假資料是不支援中文的,例如 $faker->tollFreePhoneNumber(產生假電話)。

專案 > config > app.php

1
'faker_locale' => 'zh_TW',

結論

前一章有提到Laravel Seeder,我們該如何播種,這章我們提到 Factory 如何設定假資料,去形成一個模組工廠,Seedeer 搭配 Factory 在做欄位的假內容顯得更快速許多,在寫前台或後台的程式就方便許多。

標籤: w3HexSchool PHP Laravel