ทำ Faker Data ใน Lumen (Factory and Seeds)

Sutthipong Nuanma
Amiearth
Published in
3 min readApr 28, 2019

ช่วงนี้คิดไม่ออกเลยว่าจะเขียนอะไรดี พอดีมีงานให้ Fake Data สำหรับ ทำ api พอดีเลย ตอนแรกก็มึนๆ อยู่หรอกว่าจะต้องกรอกลงฐานข้อมูลหมดเลยหรอแวะ แต่มีพี่ที บ. บอกอย่าไปยุงกับตัว migrate นะเดียวมันจะสับสนระหว่าง Data จริงกับ Fake แต่ดีก่อนที่พี่เขาพูดจบยังมี kay word ตามมา ก็คือ Factory และ Seeds คร่าวนี้แหละตามภาษาโปรแกรมเมอร์มือใหม่หัดขับก็เลยอยากรู้อยากลองเลิกงานกลับหอมานั้งหาคำตอบจนได้ว่ามันคือตัวที่ช้วยให้เรา Fake Data Api ง่ายขึ้นนั้นเอง ซึ่งอันที่จริงแล้วนั้น ตัว Lumen หรือ Laravel นั้นมันก็มีให้อยู่แล้วไม่เชื่อลองไปดูใน Folder Database ดูจะเห็นมี Folder factory กับ seed ใช้ไหม ซึ่ง 2 ตัวนี้แหละเราจะนำมันมา Fake Data กัน

** อันนี้จะเป็นเพียง guild line นะ ไม่ได้ลงลึกอะไรมาก เนื่องจากผู้เขียนก็ไม่ได้เมพขนาดนั้น

ผมจะเน้นไปทาง Lap แล้วก็อธิบายไปด้วยละกันเนาะ

เริ่มอันดับแรกทำการติดตั้ง Project สำหรับ Lumen

composer create-project --prefer-dist laravel/lumen Lumen_faker

สำหรับใคร งง ว่าเห้ยพิมพ์แค่นี้เองหรอลองกลับไปอ่านบทความเก่าผมดูนะ (ขายของนิดนึง)

สร้างฐานข้อมูลมาเพื่อที่ใช้ในการ Fake Data Api

ขั้นตอนนี้จะทำการ setting ฐานข้อมูลโดยผมจะให้ชื่อ Lumen_faker ละกับ โดยให้เป็น utf8_general_ci ด้วยนะทุกๆ คน

จากนั้นอย่าลืมไป set up File .env ด้วยละ ให้มันเชื่อมกับ Database เรา ลองๆ ดู

ทำการสร้าง Migration ขั้นมาเพื่อสร้าง table ในฐานข้อมูล

ทำไมเราถึงต้องใช้ migration ( ถามใครแวะตรู ) เพราะว่ากลัวได้ test บ่อยแล้วลบฐานข้อมูลสร้างใหม่มันจะเสียเวลา เราก็เลยใช้ migration แล้วใช้คำสั่งไป run ใน terminal เลย

ก่อนอื่นมาสร้าง File Migrate กันก่อน

php artisan make:migration create_users_table

เอาคำสั่งข้างบนไป run ใน terminal ของเราสะ เมื่อ run เสร็จลองกลับไปดู Folder ดูจะเห็นว่ามีการสร้าง File migrate ขั้นมา

มาเขียน code เพื่อสร้างฐานข้อมูลใน File Migrate กัน

จากความเดิมที่แล้วผมได้เขียน blog เกี่ยวกับการทำ migrate ไปแล้ว ลองไปติดตามกันดูผมจาก อ้างอิงจากบทความเดิมมานะ

แต่เราจะไม่ทำการ insert นะครับ เพราะ ตอนทำ Fake Data จะงงเป็นไก่ตาแตกแน่เดียว Data มันมั่ว

แต่อันที่จริง ตัว Fake ที่เราทำนี้ก็ คล้ายกับที่เราทำ insert ใน migrate นั้นแหละแต่ผมจะแบ่งให้ migrate เป็นหลักเลยในการทำงานแล้วส่วน factory กับ seed ไว้เป็นเป็นตัวที่ใช้สำหรับ Fake Data (แต่ก็ขึ้นอยู่กับการเลือกเอาไปใช้)

เมื่อเราทำตาม บทความ migrate แล้ว โดยฐานข้อมูลที่เราเลือกใช้จะไม่ใช้เป็น Lumen_migrate นะ จะใช้เป็น Lumen_faker ตามหัวข้อข้างบน และจะทำการลบ ตัวที่ใช้ insert ข้อมูลลง table ออก ถ้าเสร็จเรียบร้อยทำการ run migrate จะได้ฐานข้อมูลหน้าตาประมาณนี้

มาสร้าง Model กันก่อนเลย

มาเริ่มกันที่สร้าง Model กันก่อน เนืองจากผมสร้างฐานข้อมูลชื่อ Users มันเติม (s) เลยทำให้ได้สร้าง Model ใหม่เลย 😭 😭 😭 😭 😭 😭

ซึ่งเราจะไปทำการสร้างใน Folder app/Users.php สร้างเรียบร้อยก็เอา code ไปแปะได้เลย

ซึ่ง Model นี้เราจะกำหนด field table ว่าเราจะใช้อะไรบ่างจากฐานข้อมูลนั้นๆ แต่อันนี้ผมขอไม่ลงรายละเอียดมากละกัน

ขั้นตอนต่อไป ไปสร้าง Faker ใน Factory กัน 😁😁😁😁

ขึ้นตอนนี้เราจะเขียน File ไว้สำหรับให้ Program ทำการกรอกข้อมูลให้เราเองซึ่งเราไม่ต้องติดตั้งอะไรเลย และตัว Lumen มันก็มีอยู่แล้ว

มาเริ่มการทำ Faker กันเลย เราจะเข้าไปใน Folder database และก็เข้าไป Folder factory จะเห็น File ModelFactory.php เราจะมาทำการ Fake ใน File นี้

โดยผมจะกำหนดให้มันเรียกใช้งาน Model Users => App\Users::class และจะทำการเอา field มา fake โดยผมจะเรียกใช้ faker ซึ่งมันก็คือตัวที่ไว้สำหรับ ซุ่มข้อมูลเพื่อที่จะ insert เข้าในฐานข้อมูลแต่ละ field ที่เราได้กำหนดไว้นั้นแหละ

ถ้าใครอยากศึกษาเพิ่มเติ่ม ที่นี้เลย ละเอียดยิบ

Faker เราจะใช้งานไม่ได้เลยถ้าขาด seed

จากนั้นการ Fake Data ที่เราเขียนขึ้นมานั้นจะไม่ได้ผลเลย ถ้าเราไม่ทำการ run มันเดียวเราต้องเอากระบวนการที่เรา factory นั้นมาเรียกใช้ใน seed ก่อนโดยผมจะกลับไปที่ Folder database แล้วจะเห็นมี Folder seed นี้แหละคือสิ่งที่เราต้องการ

เราจะไปเขียน ใน File DatabaseSeeder.php นี้กันเพื่อเรียก Factory มาใช้งาน

เราก็จะทำการเรียก class ที่เราต้องการใช้งาน และผมก็กำหนดไว้ อยากให้ Fake สัก 10 user ก็พอเนาะ 😀

จากนั้นเราก็มา run ตัว File seed กันเลย

php artisan db:seed

เป็นอันเรียบร้อย ลองกลับไปดูฐานข้อมูลเราสิ

แถมนิดนึง

ที่จริง seed เราสามารถ เพิ่มข้อมูล factory ภายใน seed ได้นะ

factory(App\Users::class, 10)->create([
'fullname'=>'สุทธิพงศ์',
'lastname'=>'นวลมะ'
]);

อีกอย่างนึงก็คือ เวลาเราเพิ่มแล้วเราอยาก เอาข้อมูล users นั้นมาใส่อีก ฐานข้อมูลอีก

factory(App\Users::class, 10)->create()->each(function ($user) {
factory(App\Product::class, 10)->create([
'user_id'=>$user->id
]);
});

เพียงแค่นี้เราก็สามารถ fake ข้อมูลได้เป็นอันที่เรียบร้อยแล้ว

Fake ข้อมูลทำง่ายมากใช้ไหมละ ถ้าผิดพลาดประการใดสามารถบอกได้เลยเดอ สู้ต่อไป ทาเคชิ 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥

--

--

Sutthipong Nuanma
Amiearth

โปรแกรมเมอร์คนนึงในจังหวัดพะเยา