Bài 2: Làm việc với Database trong CI4

Database trong CI4

Làm việc với Database trong CodeIgniter 4 là bước quan trọng để xây dựng các ứng dụng web PHP hiện đại. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết cách cấu hình kết nối, thao tác dữ liệu bằng Query Builder, Model, Migration và Seeder.


1. Cấu hình Database

  • Mở file .env (CI4 đọc config từ đây)

database.default.hostname = localhost
database.default.database = ci4_app
database.default.username = root
database.default.password =
database.default.DBDriver = MySQLi
database.default.DBPrefix =
  • Nếu .env chưa mở comment thì bỏ dấu # ở đầu dòng.

➔ CI4 hỗ trợ MySQLi, PDO, PostgreSQL, SQLite, SQLSRV.


2. Query cơ bản (Database Connection)

Có 2 cách: Database Connection hoặc Model.

  • Dùng Database::connect():

    $db = \Config\Database::connect();
    $query = $db->query("SELECT * FROM posts");
    
    // Trả về mảng object
    $results = $query->getResult();
    
    // Trả về mảng array
    $results = $query->getResultArray();
  • Kết quả dạng array:

    $results = $query->getResultArray();

3. Query Builder

CI4 có Query Builder giúp viết SQL gọn hơn.

Ví dụ:

$db = \Config\Database::connect(); 
$builder = $db->table('posts'); 

// Insert 
$builder->insert([ 
    'title' => 'Bài viếtmới', 
    'content' => 'Nội dung bài viết' 
]); 
    
// Select 
$query = $builder->get(); 
$results = $query->getResult(); 

// Update
$builder->where('id', 1); 
$builder->update(['title' => 'Cập nhật tiêu đề']); 

// Delete 
$builder->where('id',1)->delete();

4. Model trong CI4

CI4 khuyến khích dùng Model thay vì viết query trực tiếp.

Ví dụ PostModel.php:

namespace App\Models;    
use CodeIgniter\Model;   

class PostModel extends Model
{
    protected $table = 'posts';            
    protected $primaryKey = 'id';        
    protected $allowedFields = ['title', 'content'];
    protected $useTimestamps = true;  
}
  • Sử dụng trong controller:

    $postModel = new \App\Models\PostModel();
    
    // Lấy tất cả bài viết
    $posts = $postModel->findAll();
    
    // Tìm theo ID
    $post = $postModel->find(1);
    
    // Thêm bài viết
    $postModel->insert([
        'title'   => 'Bài viết CI4',
        'content' => 'Nội dung bài viết',
    ]);
    
    // Cập nhật
    $postModel->update(1, [
        'title' => 'Đã sửa',
    ]);
    
    // Xóa
    $postModel->delete(1);

5. Entity (Đại diện 1 record)

Entity giúp ánh xạ 1 row trong DB thành 1 object.

  • Tạo Entity:

    php spark make:entity Post
  • File app/Entities/Post.php:

    namespace App\Entities;
    
    use CodeIgniter\Entity\Entity;
    
    class Post extends Entity
    {
        protected $attributes = [
            'title'   => null,
            'content' => null,
        ];
    }
  • Kết hợp với Model:

    protected $returnType = \App\Entities\Post::class;

➔ Giờ khi gọi $postModel->find(1) sẽ trả về object Post thay vì mảng.


6. Migration nâng cao

Ví dụ: Thêm cột status với default:

$this->forge->addField([
    'status' => [
        'type'       => 'ENUM',
        'constraint' => ['draft', 'published'],
        'default'    => 'draft',
    ]
]);
  • Rollback migration:

    php spark migrate:rollback

7. Seeder & Faker (tạo dữ liệu mẫu)

  • Seeder:

    php spark make:seeder PostSeeder
  • File app/Database/Seeds/PostSeeder.php:

    namespace App\Database\Seeds;
    
    use CodeIgniter\Database\Seeder;
    
    class PostSeeder extends Seeder
    {
        public function run()
        {
            $faker = \Faker\Factory::create();
    
            for ($i = 0; $i < 10; $i++) {
                $this->db->table('posts')->insert([
                    'title'   => $faker->sentence,
                    'content' => $faker->paragraph,
                ]);
            }
        }
    }
  • Chạy:

    php spark db:seed PostSeeder

➔ Bạn sẽ có 10 bài viết fake trong DB.


8. Transaction (Xử lý nhiều query an toàn)

$db = \Config\Database::connect();

// Bắt đầu transaction
$db->transStart();

$db->table('posts')->insert([
    'title'   => 'Test Transaction',
    'content' => 'Đang thử transaction',
]);

$db->table('logs')->insert([
    'message' => 'Đã thêm bài viết',
]);

// Hoàn tất transaction (commit nếu không lỗi, rollback nếu có lỗi)
$db->transComplete();

// Kiểm tra trạng thái transaction
if ($db->transStatus() === false) {
    // Rollback nếu có lỗi
    // Có thể log hoặc xử lý thông báo lỗi ở đây
}

✅ Tổng kết:

  • Kết nối DB bằng .env
  • Query cơ bản & Query Builder
  • CRUD với Model
  • Entity để map dữ liệu thành object
  • Migration nâng cao, Seeder, Faker
  • Transaction để xử lý an toàn

💡 Tham khảo thêm: Query Builder – CodeIgniter 4 Documentation

Xem lại: CodeIgniter 4 cơ bản – Cài đặt, Routing, Controller, Model

Thành Nguyễn

Tôi là Thành, nên tôi đặt tên blog là Thành Nè, Thánh Né... là một coder cùi bắp (Code quèn). Chẳng giỏi viết lách, chỉ giỏi chém gió và có sở thích chia sẻ những kiến thức tôi đã từng...