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

 

  • 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

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...