Data Engineering

เชื่อมหลายฐานข้อมูล MySQL ใน Codeigniter4

บางครั้งคุณจำเป็นต้องเชื่อมต่อข้อมูลหลายฐานใน Web App ของคุณ และใน Codeigniter 4 ก็มี feature นี้รองรับไว้อยู่แล้ว สามารถทำได้ง่ายๆ

ขอบคุณข้อมูลดีๆจาก : codeigniter.com onlinewebtutorblog.com , youtube

บางครั้งคุณจำเป็นต้องเชื่อมต่อข้อมูลหลายฐานใน Web App ของคุณ และใน Codeigniter 4 ก็มี feature นี้รองรับไว้อยู่แล้ว สามารถทำได้ง่ายๆ ตามขั้นตอนนี้เลย (ในหัวข้อนี้เรา assume ว่าคุณติดตั้งโปรเจคเรียบร้อยแล้วนะครับ)

ปกติแล้วเราจะ config ค่าฐานข้อมูลไว้ที่ไฟล์ .env

database.default.hostname = localhost
database.default.database = database_name
database.default.username = root
database.default.password = root
database.default.DBDriver = MySQLi

ค่าปกติระบบจะเลือกใช้ object ที่ชื่อ default ซึ่งถูก set ไว้ที่ไฟล์ app/Config/Database.php

public $defaultGroup = 'default';

วิธีโหลด Database Instance มาใช้งาน

มี syntax ให้เลือกใช้ 2 แบบในการเชื่อมต่อฐานข้อมูล คือ

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

สามารถเพิ่ม line นี้ ไปได้ทุก function ที่คุณต้องการ หรือจะเพิ่มใน constructor เพื่อทำให้สามารถเรียกใช้ใน class นั้นๆได้แบบ global

หรือจะใช้..

$db = db_connect();

วิธีนี้จะสะดวกหน่อย เพราะไม่ต้องเขียนให้ยาวเหยียด ซึ่งก็สามารถทำงานได้เหมือนกันกับ line ด้านบน

การเชื่อมต่อฐานแบบ Manual

คุณสามารถกำหนด database group ได้เอง ซึ่งชื่อ database group นั้นจะมาจาก config ไฟล์

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

เชื่อมต่อแบบหลายฐาน

มีการทำอยู่ 3 ขั้นตอน คือ

#1 เพิ่ม connection group ที่ไฟล์ .env

# DEFAULT connection group
database.default.hostname = localhost
database.default.database = database_name
database.default.username = root
database.default.password = root
database.default.DBDriver = MySQLi

# CUSTOM connection group - testDb  
database.testDb.hostname = localhost
database.testDb.database = test_database_name
database.testDb.username = test_user
database.testDb.password = test_password
database.testDb.DBDriver = MySQLi

connection group ที่เราสร้างขึ้นมาเพิ่ม คือ testDb ในส่วนค่า connection ก็กำหนดให้ถูกต้อง (บรรทัดที่มีเครื่องหมาย # คือ comment นะจ๊ะ)

#2 เพิ่ม connection array ที่ไฟล์ Database.php

เปิดไฟล์ app/Config/Database.php และเพิ่ม array ชื่อว่า $testDb เข้าไป

public $default = [
		'DSN'      => '',
		'hostname' => 'localhost',
		'username' => '',
		'password' => '',
		'database' => '',
		'DBDriver' => 'MySQLi',
		'DBPrefix' => '',
		'pConnect' => false,
		'DBDebug'  => (ENVIRONMENT !== 'production'),
		'cacheOn'  => false,
		'cacheDir' => '',
		'charset'  => 'utf8',
		'DBCollat' => 'utf8_general_ci',
		'swapPre'  => '',
		'encrypt'  => false,
		'compress' => false,
		'strictOn' => false,
		'failover' => [],
		'port'     => 3306,
];

public $testDb = [
		'DSN'      => '',
		'hostname' => 'localhost',
		'username' => '',
		'password' => '',
		'database' => '',
		'DBDriver' => 'MySQLi',
		'DBPrefix' => '',
		'pConnect' => false,
		'DBDebug'  => (ENVIRONMENT !== 'production'),
		'cacheOn'  => false,
		'cacheDir' => '',
		'charset'  => 'utf8',
		'DBCollat' => 'utf8_general_ci',
		'swapPre'  => '',
		'encrypt'  => false,
		'compress' => false,
		'strictOn' => false,
		'failover' => [],
		'port'     => 3306,
];

#3 โหลดมาใช้งาน

เราจะทดสอบเรียกใช้ที่ constructor ใน controller

<?php
namespace App\Controllers;
use App\Controllers\BaseController;

class Dashboard extends BaseController
{
    private $db1;
    private $db2;

    public function __construct()
    {
        $this->db1 = db_connect(); // default database group
        $this->db2 = db_connect("testDb"); // other database group
    }
}

หรือจะใช้ syntax..

$this->db1 = \Config\Database::connect(); // Loads default group
$this->db2 = \Config\Database::connect("testDb"); // Loads OtherDb group

ทดสอบ Query

ทดสอบ query ที่ไฟล์ model

<?php
namespace App\Models;
use CodeIgniter\Model;

class TestModel extends Model
{
    private $db2;
    public function __construct() {
        parent::__construct();
        $this->db2 = db_connect("testDb");
    }

    public function get_users() {
        $sql = "SELECT * FROM users";
        return $this->db2->query($sql)->getResult();
    }

}

หรือจะไปโหลด database group ที่ model ก็ได้

<?php
namespace App\Models;

use CodeIgniter\Model;

class TestModel extends Model
{
	protected $DBGroup     =  'testDb'; 
  

}

จบจ่ะ