База данных
Поскольку большинство плагинов устанавливают 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
.