ฐานข้อมูล

เนื่องจากปลั๊กอินส่วนใหญ่จะติดตั้ง webman-admin ดังนั้นจึงแนะนำให้ใช้การตั้งค่าฐานข้อมูลของ webman-admin โดยตรง

คลาสฐานโมเดลใช้ plugin\admin\app\model\Base จะใช้การตั้งค่าฐานข้อมูลของ webman-admin โดยอัตโนมัติ

<?php

namespace plugin\foo\app\model;

use plugin\admin\app\model\Base;

class Orders extends Base
{
    /**
     * ตารางที่เชื่อมโยงกับโมเดล
     *
     * @var string
     */
    protected $table = 'foo_orders';

    /**
     * รหัสหลักที่เชื่อมโยงกับตาราง
     *
     * @var string
     */
    protected $primaryKey = 'id';

}

ยังสามารถใช้ plugin.admin.mysql เพื่อดำเนินการฐานข้อมูลของ webman-admin ได้ เช่น

Db::connection('plugin.admin.mysql')->table('user')->first();

การใช้ฐานข้อมูลของตนเอง

ปลั๊กอินยังสามารถเลือกใช้ฐานข้อมูลของตนเองได้ เช่นเนื้อหาของ plugin/foo/config/database.php มีดังนี้

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql เป็นชื่อการเชื่อมต่อ
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'ฐานข้อมูล',
            'username'    => 'ชื่อผู้ใช้',
            'password'    => 'รหัสผ่าน',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin เป็นชื่อการเชื่อมต่อ
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'ฐานข้อมูล',
            'username'    => 'ชื่อผู้ใช้',
            'password'    => 'รหัสผ่าน',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

การอ้างอิงจะเป็น Db::connection('plugin.{ปลั๊กอิน}.{ชื่อการเชื่อมต่อ}'); เช่น

use support\Db;
Db::connection('plugin.foo.mysql')->table('user')->first();
Db::connection('plugin.foo.admin')->table('admin')->first();

ถ้าต้องการใช้ฐานข้อมูลของโปรเจกต์หลักก็สามารถใช้ได้โดยตรง เช่น

use support\Db;
Db::table('user')->first();
// สมมติว่าโปรเจกต์หลักยังได้ตั้งค่าการเชื่อมต่อ admin ไว้
Db::connection('admin')->table('admin')->first();

การตั้งค่าฐานข้อมูลให้กับ Model

เราสามารถสร้างคลาส Base สำหรับ Model ซึ่งคลาส Base จะใช้ $connection เพื่อระบุการเชื่อมต่อฐานข้อมูลของปลั๊กอิน เช่น

<?php

namespace plugin\foo\app\model;

use DateTimeInterface;
use support\Model;

class Base extends Model
{
    /**
     * @var string
     */
    protected $connection = 'plugin.foo.mysql';

}

ดังนั้นโมเดลทั้งหมดในปลั๊กอินที่สืบทอดมาจาก Base ก็จะใช้ฐานข้อมูลของปลั๊กอินโดยอัตโนมัติ

การนำเข้าฐานข้อมูลโดยอัตโนมัติ

การรัน php webman app-plugin:create foo จะสร้างปลั๊กอิน foo อัตโนมัติ ซึ่งจะประกอบด้วย plugin/foo/api/Install.php และ plugin/foo/install.sql

提示
หากไม่มีการสร้างไฟล์ install.sql ให้ลองอัปเกรด webman/console คำสั่งคือ composer require webman/console ^1.3.6

การนำเข้าฐานข้อมูลเมื่อปลั๊กอินติดตั้ง

เมื่อทำการติดตั้งปลั๊กอิน จะดำเนินการเรียกใช้เมธอด install ในไฟล์ Install.php ซึ่งเมธอดนี้จะนำเข้า SQL คำสั่งจาก install.sql โดยอัตโนมัติเพื่อให้ได้ตารางฐานข้อมูล

เนื้อหาของไฟล์ install.sql คือการสร้างตารางฐานข้อมูลและคำสั่ง SQL ที่เกี่ยวข้องกับการปรับเปลี่ยนประวัติของตาราง โดยต้อง注意ว่าคำสั่งแต่ละคำสั่งจะต้องลงท้ายด้วย ; เช่น

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'รหัสหลัก',
  `order_id` varchar(50) NOT NULL COMMENT 'รหัสคำสั่งซื้อ',
  `user_id` int NOT NULL COMMENT 'รหัสผู้ใช้',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'จำนวนเงินที่ต้องชำระ',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='คำสั่งซื้อ';

CREATE TABLE `foo_goods` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'รหัสหลัก',
  `name` varchar(50) NOT NULL COMMENT 'ชื่อ',
  `price` int NOT NULL COMMENT 'ราคา',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='สินค้า';

การเปลี่ยนการเชื่อมต่อฐานข้อมูล

การนำเข้าจาก install.sql โดยเริ่มต้นจะตั้งเป้าหมายฐานข้อมูลเป็นฐานข้อมูล webman-admin หากต้องการนำเข้าไปยังฐานข้อมูลอื่น สามารถเปลี่ยนแปลงค่า $connection ใน Install.php ได้ เช่น

<?php

class Install
{
    // ระบุฐานข้อมูลของปลั๊กอิน
    protected static $connection = 'plugin.admin.mysql';

    // ...
}

การทดสอบ

รัน php webman app-plugin:install foo เพื่อติดตั้งปลั๊กอิน จากนั้นตรวจสอบฐานข้อมูล จะพบว่าตาราง foo_orders และ foo_goods ถูกสร้างขึ้นแล้ว

การเปลี่ยนโครงสร้างตารางเมื่ออัปเกรดปลั๊กอิน

บางครั้งการอัปเกรดปลั๊กอินจำเป็นต้องสร้างตารางใหม่หรือเปลี่ยนแปลงโครงสร้างตาราง สามารถเพิ่มคำสั่งที่สัมพันธ์ได้ใน install.sql โดยต้องระวังว่าคำสั่งแต่ละคำสั่งจะต้องลงท้ายด้วย ; เช่น การเพิ่มตาราง foo_user และการเพิ่มฟิลด์ status ลงในตาราง foo_orders

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'รหัสหลัก',
  `order_id` varchar(50) NOT NULL COMMENT 'รหัสคำสั่งซื้อ',
  `user_id` int NOT NULL COMMENT 'รหัสผู้ใช้',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'จำนวนเงินที่ต้องชำระ',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='คำสั่งซื้อ';

CREATE TABLE `foo_goods` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'รหัสหลัก',
 `name` varchar(50) NOT NULL COMMENT 'ชื่อ',
 `price` int NOT NULL COMMENT 'ราคา',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='สินค้า';

CREATE TABLE `foo_user` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'รหัสหลัก',
 `name` varchar(50) NOT NULL COMMENT 'ชื่อ'
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='ผู้ใช้';

ALTER TABLE `foo_orders` ADD `status` tinyint NOT NULL DEFAULT 0 COMMENT 'สถานะ';

เมื่ออัปเกรดจะดำเนินการเรียกใช้เมธอด update ใน Install.php ซึ่งจะทำการexecute คำสั่งจาก install.sql หากมีคำสั่งใหม่จะทำการexecute คำสั่งใหม่ ถ้าเป็นคำสั่งเก่าจะข้ามไปเพื่อให้การอัปเกรดแก้ไขฐานข้อมูลได้

การลบฐานข้อมูลเมื่อยกเลิกการติดตั้งปลั๊กอิน

เมื่อทำการยกเลิกการติดตั้งปลั๊กอิน เมธอด uninstall ใน Install.php จะถูกเรียกใช้งาน ซึ่งจะวิเคราะห์อย่างอัตโนมัติว่ามีคำสั่งสร้างตารางใน install.sql อะไรบ้างและจะทำการลบตารางเหล่านั้นโดยอัตโนมัติ เพื่อให้เมื่อยกเลิกการติดตั้งปลั๊กอินจะลบตารางในฐานข้อมูลออก
หากต้องการให้การยกเลิกการติดตั้งดำเนินการเฉพาะคำสั่งใน uninstall.sql ของตนเองเท่านั้น ไม่ทำการลบตารางอัตโนมัติ สามารถสร้างไฟล์ plugin/{ชื่อปลั๊กอิน}/uninstall.sql ได้เลย ซึ่งเมธอด uninstall จะทำการexecute เฉพาะคำสั่งในไฟล์ uninstall.sql เท่านั้น