Cơ sở dữ liệu

Do hầu hết các plugin đều sẽ cài đặt webman-admin, nên khuyến nghị sử dụng trực tiếp cấu hình cơ sở dữ liệu của webman-admin.

Lớp mô hình cơ sở sử dụng plugin\admin\app\model\Base sẽ tự động sử dụng cấu hình cơ sở dữ liệu của webman-admin.

<?php

namespace plugin\foo\app\model;

use plugin\admin\app\model\Base;

class Orders extends Base
{
    /**
     * Bảng liên kết với mô hình.
     *
     * @var string
     */
    protected $table = 'foo_orders';

    /**
     * Khóa chính liên kết với bảng.
     *
     * @var string
     */
    protected $primaryKey = 'id';

}

Cũng có thể thông qua plugin.admin.mysql để thao tác cơ sở dữ liệu của webman-admin, chẳng hạn như

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

Sử dụng cơ sở dữ liệu riêng

Plugin cũng có thể chọn sử dụng cơ sở dữ liệu riêng của mình, ví dụ như nội dung của plugin/foo/config/database.php như sau

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql là tên kết nối
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'Cơ sở dữ liệu',
            'username'    => 'Tên người dùng',
            'password'    => 'Mật khẩu',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin là tên kết nối
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'Cơ sở dữ liệu',
            'username'    => 'Tên người dùng',
            'password'    => 'Mật khẩu',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

Cách tham chiếu là Db::connection('plugin.{plugin}.{tên kết nối}');, chẳng hạn như

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

Nếu muốn sử dụng cơ sở dữ liệu của dự án chính, chỉ cần sử dụng trực tiếp, chẳng hạn như

use support\Db;
Db::table('user')->first();
// giả sử dự án chính cũng đã cấu hình một kết nối admin
Db::connection('admin')->table('admin')->first();

Cấu hình cơ sở dữ liệu cho Model

Chúng ta có thể tạo một lớp Base cho Model, lớp Base sử dụng $connection để chỉ định kết nối cơ sở dữ liệu riêng của plugin, chẳng hạn như

<?php

namespace plugin\foo\app\model;

use DateTimeInterface;
use support\Model;

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

}

Như vậy, tất cả các Model trong plugin kế thừa từ Base sẽ tự động sử dụng cơ sở dữ liệu của plugin.

Tự động nhập cơ sở dữ liệu

Chạy php webman app-plugin:create foo sẽ tự động tạo plugin foo, trong đó bao gồm plugin/foo/api/Install.phpplugin/foo/install.sql.

Mẹo
Nếu không tạo được file install.sql, hãy thử nâng cấp webman/console, lệnh là composer require webman/console ^1.3.6

Nhập cơ sở dữ liệu khi cài đặt plugin

Khi cài đặt plugin, phương thức install trong Install.php sẽ tự động được thực thi, phương thức này sẽ tự động nhập các câu lệnh sql trong install.sql, từ đó thực hiện việc nhập bảng cơ sở dữ liệu tự động.

Nội dung của file install.sql là tạo bảng cơ sở dữ liệu cũng như các câu lệnh sql để thay đổi lịch sử bảng, lưu ý mỗi câu lệnh phải kết thúc bằng ;, chẳng hạn như

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Khóa chính',
  `order_id` varchar(50) NOT NULL COMMENT 'ID đơn hàng',
  `user_id` int NOT NULL COMMENT 'ID người dùng',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'Số tiền cần thanh toán',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Đơn hàng';

CREATE TABLE `foo_goods` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Khóa chính',
  `name` varchar(50) NOT NULL COMMENT 'Tên',
  `price` int NOT NULL COMMENT 'Giá',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Sản phẩm';

Thay đổi kết nối cơ sở dữ liệu

Mặc định, cơ sở dữ liệu mục tiêu được nhập từ install.sql là cơ sở dữ liệu của webman-admin, nếu muốn nhập vào cơ sở dữ liệu khác, có thể thay đổi thuộc tính $connection trong Install.php, chẳng hạn như

<?php

class Install
{
    // Chỉ định cơ sở dữ liệu riêng của plugin
    protected static $connection = 'plugin.admin.mysql';

    // ...
}

Kiểm tra

Thực thi php webman app-plugin:install foo để cài đặt plugin, sau đó kiểm tra cơ sở dữ liệu, sẽ thấy bảng foo_ordersfoo_goods đã được tạo.

Thay đổi cấu trúc bảng khi nâng cấp plugin

Đôi khi khi nâng cấp plugin cần tạo bảng mới hoặc thay đổi cấu trúc bảng, có thể trực tiếp thêm các câu lệnh tương ứng vào sau install.sql, lưu ý mỗi câu lệnh sau đó phải kết thúc bằng ;, chẳng hạn như thêm một bảng foo_user và thêm một trường status vào bảng foo_orders

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Khóa chính',
  `order_id` varchar(50) NOT NULL COMMENT 'ID đơn hàng',
  `user_id` int NOT NULL COMMENT 'ID người dùng',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'Số tiền cần thanh toán',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Đơn hàng';

CREATE TABLE `foo_goods` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Khóa chính',
 `name` varchar(50) NOT NULL COMMENT 'Tên',
 `price` int NOT NULL COMMENT 'Giá',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Sản phẩm';

CREATE TABLE `foo_user` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Khóa chính',
 `name` varchar(50) NOT NULL COMMENT 'Tên'
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Người dùng';

ALTER TABLE `foo_orders` ADD `status` tinyint NOT NULL DEFAULT 0 COMMENT 'Trạng thái';

Trong quá trình nâng cấp, phương thức update trong Install.php sẽ được thực thi, phương thức này cũng sẽ thực hiện các câu lệnh trong install.sql, nếu có câu lệnh mới sẽ thực thi các câu lệnh mới, nếu là câu lệnh cũ sẽ bỏ qua, từ đó thực hiện việc nâng cấp cho cơ sở dữ liệu.

Xóa cơ sở dữ liệu khi gỡ cài đặt plugin

Khi gỡ cài đặt plugin, phương thức uninstall trong Install.php sẽ được gọi, nó sẽ tự động phân tích các câu lệnh tạo bảng trong install.sql, và tự động xóa các bảng này, nhằm đạt được mục tiêu xóa bảng cơ sở dữ liệu khi gỡ cài đặt plugin.
Nếu chỉ muốn thực hiện uninstall.sql của riêng mình khi gỡ cài đặt, không thực hiện tự động thao tác xóa bảng, thì chỉ cần tạo plugin/{tên plugin}/uninstall.sql, như vậy phương thức uninstall chỉ thực thi các câu lệnh trong file uninstall.sql.