สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
01-406-093-203
การพัฒนาเว็บแอปพลิเคชันด้วยเฟรมเวิร์ค
โดย นายศุภมิตร จันทร์โทวงศ์
- สาขาวิชาระบบสารสนเทศ คณะบริหารธุรกิจ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 1 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เช็คชื่อเข้าชั้นเรียน
- ให้นักศึกษาสแกน QR Code นี้เพื่อเข้าสู่ระบบเช็คชื่อเข้าเรียน
- ระบบจะทำการบันทึกประวัติการเข้าเรียนในวิชานี้อัตโนมัติ
ผู้สอนยังไม่ได้เปิดระบบเช็คชื่อสำหรับบทเรียนสัปดาห์นี้ หรือหมดเวลากรอกข้อมูลแล้ว
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 2 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
Eloquent & Mass Assignment
- Mass Assignment คือความสามารถในการบันทึกข้อมูลหลายฟิลด์เข้าสู่โมเดลในครั้งเดียวด้วยคำสั่ง create()
- หากไม่มีการป้องกัน ผู้ไม่หวังดีอาจใช้วิธีลักไก่แก้ฟอร์มเพื่อส่งค่าฟิลด์ที่ไม่พึงประสงค์เข้ามาเขียนทับ (เช่น is_admin = true)
- Laravel บังคับให้นักพัฒนาต้องเลือกช่องทางกรอกข้อมูลให้ปลอดภัยผ่านตัวแปรระดับโมเดล
- ตัวแปรป้องกัน:
$fillable (อาเรย์ระบุฟิลด์ที่อนุญาต) หรือ $guarded (ฟิลด์ห้ามบันทึกโดยตรง)
code-example.php
// app/Models/Book.php
class Book extends Model
{
// กำหนดฟิลด์ที่สามารถกรอกผ่านคำสั่ง Book::create() ได้อย่างปลอดภัย
protected $fillable = ['title', 'author', 'price'];
}
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 3 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
Route Prefixes (การจัดระเบียบกลุ่มเส้นทาง)
- ใช้สำหรับจัดระเบียบและแบ่งแยกพาร์ธ URL ของแอปพลิเคชัน เช่น กลุ่ม URL หน้าจัดการระบบหลังบ้าน
- ช่วยลดความซ้ำซ้อนของการเขียนคำว่า /admin หรือ /api นำหน้าเส้นทางบ่อยๆ
- เรียกใช้งานผ่านเมธอด
Route::prefix('...') เพื่อคลุมกลุ่มเส้นทางที่สอดคล้อง - ช่วยเพิ่มความสวยงาม ความเป็นระบบ และลดความยาวของโค้ด Routing
code-example.php
// จัดระเบียบกลุ่ม URL ที่เริ่มต้นด้วย /admin
Route::prefix('admin')->group(function () {
Route::get('/users', [UserController::class, 'index']); // URL คือ /admin/users
Route::get('/settings', [SettingController::class, 'index']); // URL คือ /admin/settings
});
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 4 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 0)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 5 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 1)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 6 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 2)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 7 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 3)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 8 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 4)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 9 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 5)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 10 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 6)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 11 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 7)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 12 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 8)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 13 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
แบบทดสอบก่อนเรียน (Pre-test)
1. การเขียน Unit Testing แตกต่างจาก Feature Testing อย่างไร?
A. Unit Test ทดสอบความก้าวหน้าโครงหน้าเว็บไซต์
B. Unit Test มุ่งเน้นทดสอบเมธอดลอจิกเล็ก ๆ เฉพาะคลาสเดียวแบบแยกเดี่ยว ในขณะที่ Feature Test ทดสอบกระบวนการทำงานแบบองค์รวมที่เชื่อมโยงตารางข้อมูลหลายส่วน
C. Feature Test เขียนโค้ดยากกว่า
D. ไม่มีความแตกต่างกัน
2. คำสั่งรันระบบทดสอบ (Test Runner) ทั้งหมดที่มีในโปรเจกต์ของ Laravel คือข้อใด?
A. php artisan test
B. php artisan run:test
C. laravel test
D. composer test
3. หากต้องการจำลองตัวแปรผู้ใช้งานเข้าสู่ระบบ (Authenticate) ในคำสั่ง Feature Test ต้องใช้เมธอดคำสั่งใด?
A. $this->actingAs($user)
B. $this->loginAs($user)
C. $this->authenticate($user)
D. $this->withUser($user)
4. เมธอดตรวจสอบสถานะการตอบรับ (Assertion) ข้อใดใช้ประเมินว่าเซิร์ฟเวอร์ตอบกลับรหัสความสำเร็จ HTTP 200 OK?
A. $response->assertStatus(200)
B. $response->assertOk()
C. $response->assertSuccessful()
D. ถูกต้องทุกข้อ
5. ฟังก์ชันหรือเครื่องมือช่วยระงับการทำงานโปรแกรมชั่วคราวเพื่อตรวจสอบตัวแปร (Dump & Die) คือข้อใด?
A. dd($variable)
B. dump($variable)
C. die($variable)
D. print($variable)
6. โฟลเดอร์ใดในระบบของ Laravel ที่ใช้สำหรับการจัดเก็บสคริปต์ไฟล์ทดสอบทั้งหมด?
A. tests/
B. app/Tests/
C. database/factories/
D. storage/testing/
7. คำสั่งในการสร้างคลาสไฟล์ตรวจสอบสัญกรณ์ระบบแบบ Feature Test ตัวใหม่คือข้อใด?
A. php artisan make:test UserTest
B. php artisan new:test UserTest
C. laravel make:test UserTest
D. composer make:test UserTest
8. เมธอดคำสั่งใดใช้ระบุตรวจสอบความถูกต้องว่ามีคอลัมน์ข้อมูลชุดดังกล่าวอยู่ภายในตารางฐานข้อมูลจริง?
A. $this->assertDatabaseHas('table_name', ['data'])
B. $this->assertDatabaseExist('table_name', ['data'])
C. $this->assertTableHas('table_name', ['data'])
D. $this->assertRecordHas('table_name', ['data'])
9. หากต้องการตรวจสอบว่าเบราว์เซอร์ผู้ใช้ถูกเปลี่ยนทิศทางเส้นทาง (Redirect) ไปหน้าล็อกอินหลังทำขั้นตอนเสร็จสิ้น ต้องใช้เมธอดคำสั่งใด?
A. $response->assertRedirect('/login')
B. $response->assertPath('/login')
C. $response->assertGoTo('/login')
D. $response->assertUrl('/login')
10. การใช้เทคนิค 'RefreshDatabase' ในไฟล์ทดสอบมีบทบาทอย่างไร?
A. ล้างตารางข้อมูลและประมวลผลไมเกรชันตารางทดสอบใหม่ก่อนรันแต่ละไฟล์ เพื่อป้องกันข้อมูลการทดสอบเก่าสะสมปนเปกัน
B. รีสตาร์ตระบบเว็บเซิร์ฟเวอร์
C. อัปเดต PHPUnit อัตโนมัติ
D. ข้ามผ่านขั้นตอนการบันทึกฐานข้อมูล
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 14 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 10)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 15 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 11)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 16 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
เนื้อหาเสริมการเรียนรู้บทเรียนที่ 13 (ตอนที่ 12)
- ศึกษาเพิ่มเติมจากเอกสารประกอบการสอนหลักและคู่มือฝึกปฏิบัติ
- ทบทวนหัวข้อสำคัญของบทเรียน โครงสร้างโค้ด และสถาปัตยกรรมระบบ
- ฝึกฝนทักษะการเขียนโปรแกรมผ่านเวิร์กชอปท้ายบทเพื่อเพิ่มความชำนาญ
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 17 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
แบบทดสอบหลังเรียน (Post-test)
1. การเขียน Unit Testing แตกต่างจาก Feature Testing อย่างไร?
A. Unit Test ทดสอบความก้าวหน้าโครงหน้าเว็บไซต์
B. Unit Test มุ่งเน้นทดสอบเมธอดลอจิกเล็ก ๆ เฉพาะคลาสเดียวแบบแยกเดี่ยว ในขณะที่ Feature Test ทดสอบกระบวนการทำงานแบบองค์รวมที่เชื่อมโยงตารางข้อมูลหลายส่วน
C. Feature Test เขียนโค้ดยากกว่า
D. ไม่มีความแตกต่างกัน
2. คำสั่งรันระบบทดสอบ (Test Runner) ทั้งหมดที่มีในโปรเจกต์ของ Laravel คือข้อใด?
A. php artisan test
B. php artisan run:test
C. laravel test
D. composer test
3. หากต้องการจำลองตัวแปรผู้ใช้งานเข้าสู่ระบบ (Authenticate) ในคำสั่ง Feature Test ต้องใช้เมธอดคำสั่งใด?
A. $this->actingAs($user)
B. $this->loginAs($user)
C. $this->authenticate($user)
D. $this->withUser($user)
4. เมธอดตรวจสอบสถานะการตอบรับ (Assertion) ข้อใดใช้ประเมินว่าเซิร์ฟเวอร์ตอบกลับรหัสความสำเร็จ HTTP 200 OK?
A. $response->assertStatus(200)
B. $response->assertOk()
C. $response->assertSuccessful()
D. ถูกต้องทุกข้อ
5. ฟังก์ชันหรือเครื่องมือช่วยระงับการทำงานโปรแกรมชั่วคราวเพื่อตรวจสอบตัวแปร (Dump & Die) คือข้อใด?
A. dd($variable)
B. dump($variable)
C. die($variable)
D. print($variable)
6. โฟลเดอร์ใดในระบบของ Laravel ที่ใช้สำหรับการจัดเก็บสคริปต์ไฟล์ทดสอบทั้งหมด?
A. tests/
B. app/Tests/
C. database/factories/
D. storage/testing/
7. คำสั่งในการสร้างคลาสไฟล์ตรวจสอบสัญกรณ์ระบบแบบ Feature Test ตัวใหม่คือข้อใด?
A. php artisan make:test UserTest
B. php artisan new:test UserTest
C. laravel make:test UserTest
D. composer make:test UserTest
8. เมธอดคำสั่งใดใช้ระบุตรวจสอบความถูกต้องว่ามีคอลัมน์ข้อมูลชุดดังกล่าวอยู่ภายในตารางฐานข้อมูลจริง?
A. $this->assertDatabaseHas('table_name', ['data'])
B. $this->assertDatabaseExist('table_name', ['data'])
C. $this->assertTableHas('table_name', ['data'])
D. $this->assertRecordHas('table_name', ['data'])
9. หากต้องการตรวจสอบว่าเบราว์เซอร์ผู้ใช้ถูกเปลี่ยนทิศทางเส้นทาง (Redirect) ไปหน้าล็อกอินหลังทำขั้นตอนเสร็จสิ้น ต้องใช้เมธอดคำสั่งใด?
A. $response->assertRedirect('/login')
B. $response->assertPath('/login')
C. $response->assertGoTo('/login')
D. $response->assertUrl('/login')
10. การใช้เทคนิค 'RefreshDatabase' ในไฟล์ทดสอบมีบทบาทอย่างไร?
A. ล้างตารางข้อมูลและประมวลผลไมเกรชันตารางทดสอบใหม่ก่อนรันแต่ละไฟล์ เพื่อป้องกันข้อมูลการทดสอบเก่าสะสมปนเปกัน
B. รีสตาร์ตระบบเว็บเซิร์ฟเวอร์
C. อัปเดต PHPUnit อัตโนมัติ
D. ข้ามผ่านขั้นตอนการบันทึกฐานข้อมูล
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 18 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
คำถามท้ายบทเรียน
ตัวแปรใดในโมเดลของ Laravel ที่ใช้ทำหน้าที่ระบุรายชื่อฟิลด์คอลัมน์ที่อนุญาตให้เขียนผ่านระบบ Mass Assignment ได้?
A. protected $allow
B. protected $fillable
C. protected $guarded
D. protected $safety
คำอธิบาย: ตัวแปร protected $fillable ใช้ระบุช่องข้อมูลความปลอดภัยที่อนุญาตให้กรอกบันทึกข้อมูลผ่านทางคำสั่ง create ได้ทีเดียว
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 19 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
Workshop 13: ทำระบบ Mass Assignment และจัดการกลุ่ม Route Admin
- 1เปิดคลาสโมเดลและประกาศตัวแปรอาร์เรย์ป้องกัน $fillable หรือ $guarded ครอบฟิลด์ที่กำหนด
- 2เปลี่ยนฟังก์ชันการเขียนข้อมูลจาก insert ทั่วไป มาใช้แบบสร้างผ่านโมเดล Product::create()
- 3จัดกลุ่ม Route หลังบ้านโดยกำหนด Group และ Prefix ชี้พาร์ธไปที่ '/admin'
- 4ทดสอบและพิมพ์ผลลัพธ์การเขียนส่งข้อมูลแบบแถวผ่านฟังก์ชันควบคุมความปลอดภัย
command_prompt.sh
protected $fillable = ['name', 'price', 'description'];
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 20 / 21
สัปดาห์ที่ 13 • การจัดการข้อมูลระดับโมเดลและคำนำหน้าเส้นทาง01-406-093-203 Laravel Course
ใบงานที่ 13: ออกแบบความปลอดภัยในการเพิ่มข้อมูลและจัดโครงสร้างความปลอดภัยของกลุ่ม Admin
ทำฟิลด์บันทึกประวัติพนักงานโดยใช้คำสั่ง Eloquent Model ป้องกันการแก้ไขฟิลด์ลับ (เช่น is_admin) ผ่านระบบคุม Mass Assignment และใช้ระบบแบ่ง Prefix หน้าที่ทั้งหมด
เกณฑ์การตรวจประเมินผล:
- การกำหนด $fillable และป้องกันฟิลด์ไม่พึงประสงค์ได้สำเร็จ40%
- การจัดโครงสร้างกลุ่ม Route โดยใช้ Prefix และ Named Route ได้สมบูรณ์40%
- ความสอดคล้องการส่งงานและโครงสร้างโปรแกรม20%
อาจารย์ผู้บรรยาย: ศุภมิตร จันทร์โทวงศ์สไลด์ที่ 21 / 21