データベース

ほとんどのプラグインが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.phpplugin/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_ordersfoo_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ファイル内の文のみを実行します。