База данных

Поскольку большинство плагинов устанавливают 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';

}

Также можно управлять базой данных webman-admin через plugin.admin.mysql, например:

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

Мы можем создать класс Base для Model, где через $connection указываем собственное подключение плагина, например:

<?php

namespace plugin\foo\app\model;

use DateTimeInterface;
use support\Model;

class Base extends Model
{
    /**
     * @var string
     */
    protected $connection = 'plugin.foo.mysql';

}

Таким образом, все модели плагина, наследуемые от 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 из Install.php, который автоматически импортирует SQL-запросы из install.sql, достигая таким образом автоматического импорта таблиц базы данных.

Содержимое файла install.sql - это создание таблиц базы данных и SQL-запросы для последующих изменений таблиц, обратите внимание, что каждый запрос должен завершаться ;, например:

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Основной ключ',
  `order_id` varchar(50) NOT NULL COMMENT 'Идентификатор заказа',
  `user_id` int NOT NULL COMMENT 'Идентификатор пользователя',
  `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. Если вы хотите импортировать данные в другую базу данных, вы можете изменить свойство $connection в Install.php, например:

<?php

class Install
{
    // Указываем собственную базу данных плагина
    protected static $connection = 'plugin.admin.mysql';

    // ...
}

Тест

Выполните php webman app-plugin:install foo, затем проверьте базу данных, вы увидите, что таблицы foo_orders и foo_goods были созданы.

Изменение структуры таблиц при обновлении плагина

Иногда при обновлении плагина необходимо создать новые таблицы или изменить структуру существующих таблиц, вы можете просто добавить соответствующие запросы в конец install.sql, не забывая, что каждый запрос должен заканчиваться ;, например, добавим таблицу foo_user и добавим поле status в таблицу foo_orders:

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Основной ключ',
  `order_id` varchar(50) NOT NULL COMMENT 'Идентификатор заказа',
  `user_id` int NOT NULL COMMENT 'Идентификатор пользователя',
  `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 'Статус';

При обновлении будет выполнен метод update из Install.php, который также выполнит запросы из install.sql, новые запросы будут выполнены, а старые будут пропущены, так достигается изменение базы данных при обновлении.

Удаление базы данных при удалении плагина

Во время удаления плагина будет вызван метод uninstall из Install.php, который автоматически проанализирует, какие запросы на создание таблиц есть в install.sql, и удалит эти таблицы, достигая тем самым удаления таблиц базы данных при удалении плагина.
Если вы хотите при удалении просто выполнить свой uninstall.sql, не выполняя автоматическое удаление таблиц, вам нужно просто создать файл plugin/имя_плагина/uninstall.sql, в этом случае метод uninstall выполнит только запросы из файла uninstall.sql.