วันศุกร์ที่ 20 ธันวาคม พ.ศ. 2562

Laravel 5.8 - การเชื่อมต่อกับฐานข้อมูล MySQL

โครงสร้างใน Folder Project

- app : เก็บ Model และ Controller
- config : เก็บค่า Config ต่าง ๆ
- database : เก็บ Migration และ Seeding สำหรับสร้าง Table
- public : เก็บ CSS, JS ไฟล์ต่างๆ ที่ให้เข้าถึงได้ และ .htaccess ด้วย
- resource : เก็บส่วนการแสดงผล View
- routes : เก็บไฟล์ที่ใช้กำหนด Url
- storage : เก็บข้อมูล Caches, Session, ไฟล์ Blade Engine ที่ Complied
- tests : เก็บ Automated Test
- *.env : เก็บ Config Laravel กับ ฐานข้อมูล

การ Config ไฟล์

อ่านเพิ่มเติมได้ที่ https://laravel.com/docs/5.8/database
ไฟล์ที่เราต่อกับฐานข้อมูลจะใช้มี 2 จุด
1. project/config/database.php
2. .env

แก้ไขในส่วนของ Host, Port, DBName, Username และ Password ให้ถูกต้อง
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'laravel_db'),
            'username' => env('DB_USERNAME', 'laravel'),
            'password' => env('DB_PASSWORD', 'laravel'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

แก้ไขให้ถูกต้องเหมือนกัน
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=

การสร้าง Model

อ่านเพิ่มเติมได้ที่ https://laravel.com/docs/5.8/eloquent#defining-models
ให้เราทำการสร้าง Model โดยใช้คำสั่ง artisan make:model
* ข้อสังเกตุ Model User จะอยู่ใน Folder app ชื่อว่า User.php และมีการเก็บ Migration ไว้ที่ Folder database/migrations/* เราเลยใช้เป็น Member แทน
# php artisan make:model Flight -m
php artisan make:model Member -m

เมื่อเราสร้างเสร็จแล้วจะได้ไฟล์ Member.php ใน Folder app และไฟล์ใน Folder database/migrations/ มาอีก 1 ไฟล์
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    //
}
...
    public function up()
    {
        Schema::create('members', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }
...

ให้เราทำการแก้ไขไฟล์ Members.php เพิ่มส่วนที่เป็น $fillable ใส่ชื่อ Field ที่เรารับค่าเพื่อไปลงยังฐานข้อมูล
และทำการแก้ไขไฟล์ 2019_12_19_151341_create_members_table.php ใน Function up() เพื่อกำหนด Table ฐานข้อมูล
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    protected $fillable=['first_name','last_name'];
}
...
    public function up()
    {
        Schema::create('members', function (Blueprint $table) {
            $table->increments('id');
            $table->string('first_name');
            $table->string('last_name');
            $table->timestamps();
        });
    }
...

*** อย่าลืม Save
เสร็จแล้วสั่งสร้าง Table โดยคำสั่ง artisan migrate เสร็จแล้วกลับไปดูที่ Database
php artisan migrate

การสร้าง Controller สำหรับจัดการข้อมูล

เราจะใช้คำสั่ง artisan make:controller และบอกว่าใช้จัดการกับ resource เราจะได้ Controller ที่มาพร้อมกับ Function ให้เราใช้งาน
index(), create(), store(Request $request), show($id), edit($id), update(Request $request, $id) และ destroy($id)

การใช้งานแต่ละ Function
index(): Display a listing of the resource.
create(): Show the form for creating a new resource.
store(Request $request): Store a newly created resource in storage.
show($id): Display the specified resource.
edit($id): Show the form for editing the specified resource.
update(Request $request, $id): Update the specified resource in storage.
destroy($id): Remove the specified resource from storage.

อ่านเพิ่มเติมที่ https://laravel.com/docs/5.8/controllers#resource-controllers
# php artisan make:controller PhotoController --resource
php artisan make:controller MembersController --resource

เสร็จแล้วทำการสร้าง Route ไปยัง Controller ที่พึ่งสร้างไปคือ MembersController
...
// สร้าง Route ชื่อ "member" ส่งไปยัง Controller ชื่อ MembersController
// ส่วนนี้ถ้าเราไม่ได้มี @ แล้วต่อด้วยชื่อ Function เวลาที่เราเรียก url: members/ หลัง "/" เป็นชื่ออะไรก็จะส่งไปที่ Function ชื่อนั้น
// เช่น members/create ก็จะไปเรียก Function create() ใน MembersController

Route::resource('members', 'MembersController');
...

ทำการ Import Model Member และเพิ่มคำสั่งในการบันทึกข้อมูลที่ Function store(Request $request) ใน MembersController
...
// Import Model Member
use App\Member;

class MembersController extends Controller
{
...
    public function store(Request $request)
    {
        // ส่วนของการ Validate ต้องมีข้อมูล first_name และ last_name 
        $this->validate($request, ['first_name'=>'required', 'last_name'=>'required']);

        // ทำการสร้าง Object Member Model และเพิ่มข้อมูลที่ได้จาก $request แล้วทำการ Save ข้อมูลลง Database
        $member = new Member(['first_name' => $request->get('first_name'), 'last_name' => $request->get('last_name')]);
        $member->save();

        // Redirect ไปที่ route "members.create" คือการส่งไปที่ url "members/create"
        return redirect()->route('members.create');
    }
...
}

ตัวอย่างหน้า Form ส่วนของ View
Function {{csrf_field()}} ใช้สร้าง Token หน้า Form แล้ว Function {{url('members')}} เป็นการสร้าง url ไปยัง route members
<div class="container">
        <div class="row">
            <div class="col-md-12">
                <h2 align="center">Member Create</h2>
                <form method="post" action="{{url('members')}}">
                    {{csrf_field()}}
                    <div class="form-group"><input type="text" name="first_name" class="form-control"></div>
                    <div class="form-group"><input type="text" name="last_name" class="form-control"></div>
                    <div class="form-group"><input type="submit" value="Submit" class="btn btn-primary"></div>
                    </div>
                </form>
            </div>
        </div>
    </div>

ไม่มีความคิดเห็น:

แสดงความคิดเห็น