データベース

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