データベース
ほとんどのプラグインは 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にデータベースを設定する
ModelのためにBaseクラスを作成し、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文と、テーブルの履歴変更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
にあるテーブル作成文を自動的に分析し、これらのテーブルを自動的に削除します。これにより、プラグインをアンインストールした際にデータベーステーブルを削除する目的を達成します。
もしアンインストール時に自分の uninstall.sql
だけを実行させたく、デフォルトのテーブル削除操作を実行したくない場合は、単に plugin/プラグイン名/uninstall.sql
を作成すればよく、そうすることで uninstall
メソッドは uninstall.sql
ファイル内の文のみを実行します。