0

PHP và MySQL Bài 37: Kết nối Cơ sở dữ liệu và "Phép thuật" Eloquent ORM

Khi nhắc đến việc tương tác với cơ sở dữ liệu trong các dự án PHP truyền thống, chúng ta thường phải tự viết lệnh kết nối PDO và các câu lệnh SQL thô như SELECT * FROM... [cite: x]. Tuy nhiên, trong Laravel, mọi thứ trở nên vô cùng nhẹ nhàng và trực quan nhờ mô hình Eloquent ORM (Object-Relational Mapping) [cite: x].

Trong Eloquent, mỗi bảng trong Database (ví dụ: posts) sẽ tương ứng với một Class (Model) trong PHP (ví dụ: Post) [cite: x]. Khi thao tác với Class này, Laravel sẽ tự động dịch các phương thức thành câu lệnh SQL cực kỳ an toàn [cite: x].


1. Cấu hình kết nối MySQL

Trước tiên, bạn cần khai báo cho Laravel biết kho dữ liệu của bạn nằm ở đâu [cite: x].

Mở file .env ở thư mục gốc của dự án và tìm đến đoạn DB_.... Hãy điền thông tin Database của bạn vào đây (ví dụ khi dùng XAMPP/Laragon mặc định) [cite: x]:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=he_thong_ban_ve   # Tên Database bạn đã tạo trong phpMyAdmin
DB_USERNAME=root              # User mặc định
DB_PASSWORD=                  # Pass mặc định thường để trống

⚠️ Lưu ý: Sau khi sửa file .env, nếu server đang chạy (php artisan serve), bạn nên tắt đi (Ctrl + C) và bật lại để Laravel nhận cấu hình mới [cite: x].


2. Tạo Model và Migration cùng lúc

Trong Laravel, chúng ta hiếm khi mở phpMyAdmin lên để tạo bảng bằng tay [cite: x]. Thay vào đó, chúng ta viết code PHP để quản lý cấu trúc bảng, quá trình này gọi là Migration (Di cư dữ liệu) [cite: x].

Mở Terminal tại thư mục gốc của dự án và sử dụng Artisan để tạo Model Post kèm theo cờ -m (nghĩa là tự động tạo luôn file Migration cho bảng này) [cite: x]:

php artisan make:model Post -m

Artisan vừa thực hiện 2 việc [cite: x]:

  1. Tạo file Model tại app/Models/Post.php [cite: x].
  2. Tạo một file Migration tại database/migrations/xxxx_xx_xx_xxxxxx_create_posts_table.php [cite: x].

3. Khai báo cấu trúc bảng (Migration)

Mở file Migration vừa được tạo ra. Ở hàm up(), bạn định nghĩa các cột cho bảng posts [cite: x]:

public function up(){
    Schema::create('posts', function (Blueprint $table) {
        $table->id(); // Tự động tạo cột id (Primary Key, Auto Increment)
        $table->string('title'); // Cột tiêu đề (VARCHAR)
        $table->text('content'); // Cột nội dung (TEXT)
        $table->string('status')->default('published'); // Trạng thái
        $table->timestamps(); // Cực kỳ ảo diệu: Tự động tạo 2 cột created_at và updated_at
    });
}

Lưu file lại và chạy lệnh sau trên Terminal để Laravel "dịch" bản thiết kế này thành một bảng thật trong MySQL [cite: x]:

php artisan migrate

(Lúc này, nếu mở phpMyAdmin, bạn sẽ thấy bảng posts đã xuất hiện) [cite: x].


4. Thay thế Mảng ảo bằng Dữ liệu thật (Eloquent)

Bây giờ, hãy thêm 1-2 dòng dữ liệu trực tiếp vào bảng posts trong phpMyAdmin để chúng ta có dữ liệu hiển thị ra màn hình [cite: x].

Tiếp theo, mở file app/Http/Controllers/HomeController.php ở Bài 36 lên và thay thế toàn bộ mảng dữ liệu "cứng" bằng Eloquent [cite: x]:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post; // BẮT BUỘC: Gọi Model Post vào để sử dụng

class HomeController extends Controller
{
    public function index() {
        $pageTitle = "Danh sách Bài viết từ Database";

        // Thay vì viết SQL: SELECT * FROM posts
        // Eloquent ORM chỉ cần 1 dòng cực kỳ ngắn gọn:
        $posts = Post::all();

        // Hoặc nếu bạn muốn lọc các bài viết 'published' và sắp xếp mới nhất:
        // $posts = Post::where('status', 'published')->latest()->get();

        return view('home', compact('pageTitle', 'posts')); 
    }
}

5. View (Blade) tự động tương thích

Điều tuyệt vời là bạn không cần sửa lại bất kỳ dòng code nào trong file resources/views/home.blade.php [cite: x].

Vì hàm Post::all() trả về một Tập hợp (Collection) các đối tượng có cấu trúc tương tự mảng, vòng lặp @forelse và cách in biến {{ $post['title'] }} (hoặc {{ $post->title }}) vẫn hoạt động hoàn hảo [cite: x].

Ra trình duyệt và F5 (http://localhost:8000/home), bạn sẽ thấy dữ liệu thật từ MySQL đã được đổ ra màn hình! [cite: x]


Tổng kết

Với Eloquent ORM, những lệnh CRUD phức tạp nhất, những câu JOIN bảng rườm rà nhất đều được đơn giản hóa thành các hàm dễ đọc như tiếng Anh (Ví dụ: find(), where(), first(), delete()) [cite: x].


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí