最近面試很多間公司,很感謝願意給我機會的公司,但是或許我自己能力不足讓很多公司覺得自己不是被需要的人才,但我相信會有公司願意給我機會發展及一起奮鬥。
什麼是 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
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
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
| >>> 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 {
public function run() { 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 {
public function run() { $this->call(MembersTableSeeder::class); } }
|
執行Seeder
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
建立一個虛擬的文件,將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
| >>> 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
| >>> 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
| >>> App\Member::count();
|
列出資料表的所有資料
檢視會員資料表內所有新增的資料
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