
-
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.2. Query cơ bản (Database Connection)
Có 2 cách: Database Connection hoặc Model.
-
Dùng
Database::connect()
:use CodeIgniter\Database\Config; $db = \Config\Database::connect(); $query = $db->query("SELECT * FROM posts"); $results = $query->getResult(); // Trả về mảng object
-
Kết quả dạng array:
$results = $query->getResultArray();
2.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ết mớ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();
2.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; // auto fill created_at, updated_at
}
-
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);
2.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.
2.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
2.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.
2.8. Transaction (Xử lý nhiều query an toàn)
$db = \Config\Database::connect();
$db->transStart();
$db->table('posts')->insert([
'title' => 'Test Transaction',
'content' => 'Đang thử transaction'
]);
$db->table('logs')->insert([
'message' => 'Đã thêm bài viết'
]);
$db->transComplete();
if ($db->transStatus() === false) {
// Rollback nếu lỗi
}
✅ Sau bài 2, bạn sẽ biế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