
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