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.php
và plugin/foo/install.sql
.
Mẹo
Nếu không tạo được file install.sql, hãy thử nâng cấpwebman/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_orders
và foo_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
.