數(shù)據(jù)庫(kù)
由于大部分插件都會(huì)安裝webman-admin,所以建議直接復(fù)用webman-admin
的數(shù)據(jù)庫(kù)配置。
模型基類使用plugin\admin\app\model\Base
則會(huì)自動(dòng)使用webman-admin
的數(shù)據(jù)庫(kù)配置。
<?php
namespace plugin\foo\app\model;
use plugin\admin\app\model\Base;
class Orders extends Base
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'foo_orders';
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'id';
}
也可以通過(guò)plugin.admin.mysql
操作webman-admin
的數(shù)據(jù)庫(kù),例如
Db::connection('plugin.admin.mysql')->table('user')->first();
使用自己的數(shù)據(jù)庫(kù)
插件也可以選擇使用自己的數(shù)據(jù)庫(kù),例如plugin/foo/config/database.php
內(nèi)容如下
return [
'default' => 'mysql',
'connections' => [
'mysql' => [ // mysql為連接名
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => '數(shù)據(jù)庫(kù)',
'username' => '用戶名',
'password' => '密碼',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
'admin' => [ // admin為連接名
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => '數(shù)據(jù)庫(kù)',
'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();
如果想使用主項(xiàng)目的數(shù)據(jù)庫(kù),則直接使用即可,例如
use support\Db;
Db::table('user')->first();
// 假設(shè)主項(xiàng)目還配置了一個(gè)admin連接
Db::connection('admin')->table('admin')->first();
給Model配置數(shù)據(jù)庫(kù)
我們可以為Model創(chuàng)建一個(gè)Base類,Base類用$connection
指定插件自己的數(shù)據(jù)庫(kù)連接,例如
<?php
namespace plugin\foo\app\model;
use DateTimeInterface;
use support\Model;
class Base extends Model
{
/**
* @var string
*/
protected $connection = 'plugin.foo.mysql';
}
這樣插件里所有的Model繼承自Base,就自動(dòng)使用了插件自己的數(shù)據(jù)庫(kù)。
自動(dòng)導(dǎo)入數(shù)據(jù)庫(kù)
運(yùn)行 php webman app-plugin:create foo
會(huì)自動(dòng)創(chuàng)建foo插件,其中包含 plugin/foo/api/Install.php
和 plugin/foo/install.sql
。
提示
如果沒(méi)有生成install.sql文件請(qǐng)嘗試升級(jí)webman/console
,命令為composer require webman/console ^1.3.6
插件安裝時(shí)導(dǎo)入數(shù)據(jù)庫(kù)
安裝插件時(shí)會(huì)執(zhí)行Install.php里的install
方法,該方法會(huì)自動(dòng)導(dǎo)入install.sql
里的sql語(yǔ)句,從而實(shí)現(xiàn)自動(dòng)導(dǎo)入數(shù)據(jù)庫(kù)表的目的。
install.sql
文件內(nèi)容是創(chuàng)建數(shù)據(jù)庫(kù)表以及對(duì)表歷史修改sql語(yǔ)句,注意每個(gè)語(yǔ)句必須用;
結(jié)束,例如
CREATE TABLE `foo_orders` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`order_id` varchar(50) NOT NULL COMMENT '訂單id',
`user_id` int NOT NULL COMMENT '用戶id',
`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 '價(jià)格',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='商品';
更改數(shù)據(jù)庫(kù)連接
install.sql
導(dǎo)入的目標(biāo)數(shù)據(jù)庫(kù)默認(rèn)為webman-admin
的數(shù)據(jù)庫(kù),如果想導(dǎo)入到其它數(shù)據(jù)庫(kù),可以修改Install.php
里的$connection
屬性,例如
<?php
class Install
{
// 指定插件自己的數(shù)據(jù)庫(kù)
protected static $connection = 'plugin.admin.mysql';
// ...
}
測(cè)試
執(zhí)行php webman app-plugin:install foo
安裝插件,然后查看數(shù)據(jù)庫(kù),會(huì)發(fā)現(xiàn)foo_orders
和foo_goods
表已經(jīng)創(chuàng)建了。
插件升級(jí)時(shí)更改表結(jié)構(gòu)
有時(shí)候插件升級(jí)需要新建表或更改表結(jié)構(gòu),可以直接在install.sql
后面追加對(duì)應(yīng)的語(yǔ)句即可,注意每個(gè)語(yǔ)句后面用;
結(jié)束,例如追加一個(gè)foo_user
表以及給foo_orders
表增加一個(gè)status
字段
CREATE TABLE `foo_orders` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`order_id` varchar(50) NOT NULL COMMENT '訂單id',
`user_id` int NOT NULL COMMENT '用戶id',
`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 '價(jià)格',
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 '狀態(tài)';
升級(jí)時(shí)會(huì)執(zhí)行Install.php里的update
方法,該方法同樣會(huì)執(zhí)行install.sql
里的語(yǔ)句,如果有新的語(yǔ)句會(huì)執(zhí)行新的語(yǔ)句,如果是舊的語(yǔ)句會(huì)跳過(guò),從而實(shí)現(xiàn)升級(jí)對(duì)數(shù)據(jù)庫(kù)的修改。
卸載插件時(shí)刪除數(shù)據(jù)庫(kù)
卸載插件時(shí)Install.php
的uninstall
方法會(huì)被調(diào)用,它會(huì)自動(dòng)分析install.sql
里有哪些建表語(yǔ)句,并自動(dòng)刪除這些表,達(dá)到卸載插件時(shí)刪除數(shù)據(jù)庫(kù)表的目的。
如果想卸載時(shí)只想執(zhí)行自己的uninstall.sql
,不執(zhí)行自動(dòng)的刪表操作,則只需要?jiǎng)?chuàng)建plugin/插件名/uninstall.sql
即可,這樣uninstall
方法只會(huì)執(zhí)行uninstall.sql
文件里的語(yǔ)句。