データベース
ほとんどのプラグインが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
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'foo_orders';
/**
* The primary key associated with the table.
*
* @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用のデータベース設定
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';
}
これにより、プラグイン内の全てのModelが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.phpのinstallメソッドが実行され、install.sql内のSQL文が自動実行されて、データベーステーブルがインポートされます。
install.sqlの内容は、テーブル作成およびテーブルの履歴変更SQL文であり、各文は;で終了する必要があります。例:
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 '価格',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='商品';
データベース接続の変更
install.sqlのインポート先はデフォルトでwebman-adminのデータベースです。他のデータベースにインポートするには、Install.phpの$connectionプロパティを変更してください。例:
<?php
class Install
{
// プラグイン独自のデータベースを指定
protected static $connection = 'plugin.admin.mysql';
// ...
}
テスト
php webman app-plugin:install fooを実行してプラグインをインストールし、データベースを確認すると、foo_ordersとfoo_goodsテーブルが作成されているはずです。
プラグインアップグレード時のテーブル構造変更
プラグインのアップグレードで新規テーブルの作成やテーブル構造の変更が必要な場合、install.sqlの末尾に対応する文を追加してください。各文は;で終了する必要があります。例:foo_userテーブルとfoo_ordersテーブルへの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 '価格',
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 '状態';
アップグレード時にはInstall.phpのupdateメソッドが実行され、同様にinstall.sql内の文を実行します。新しい文があれば実行され、既に実行済みの文はスキップされるため、アップグレード時のデータベース変更が正しく適用されます。
プラグインアンインストール時のデータベース削除
プラグインのアンインストール時に、Install.phpのuninstallメソッドが呼び出されます。このメソッドはinstall.sql内のCREATE TABLE文を自動解析し、それらのテーブルを削除して、アンインストール時にデータベーステーブルを削除します。
アンインストール時に独自のuninstall.sqlのみを実行し、自動的なテーブル削除を行いたくない場合は、plugin/プラグイン名/uninstall.sqlを作成してください。これによりuninstallメソッドはuninstall.sqlファイル内の文のみを実行します。