Banco de Dados

Como a maioria dos plugins instalará o webman-admin, é recomendado reutilizar diretamente a configuração de banco de dados do webman-admin.

A classe base do modelo utiliza plugin\admin\app\model\Base, o que fará com que a configuração de banco de dados do webman-admin seja automaticamente usada.

<?php

namespace plugin\foo\app\model;

use plugin\admin\app\model\Base;

class Orders extends Base
{
    /**
     * A tabela associada ao modelo.
     *
     * @var string
     */
    protected $table = 'foo_orders';

    /**
     * A chave primária associada à tabela.
     *
     * @var string
     */
    protected $primaryKey = 'id';

}

Você também pode usar plugin.admin.mysql para operar o banco de dados do webman-admin, por exemplo:

Db::connection('plugin.admin.mysql')->table('user')->first();

Usando seu próprio banco de dados

Os plugins também podem optar por usar seu próprio banco de dados, por exemplo, o conteúdo de plugin/foo/config/database.php é o seguinte:

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql é o nome da conexão
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'Banco de Dados',
            'username'    => 'Nome de Usuário',
            'password'    => 'Senha',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin é o nome da conexão
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'Banco de Dados',
            'username'    => 'Nome de Usuário',
            'password'    => 'Senha',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

A forma de referência é Db::connection('plugin.{plugin}.{nome da conexão}');, por exemplo:

use support\Db;
Db::connection('plugin.foo.mysql')->table('user')->first();
Db::connection('plugin.foo.admin')->table('admin')->first();

Se você quiser usar o banco de dados do projeto principal, basta usá-lo diretamente, por exemplo:

use support\Db;
Db::table('user')->first();
// Supondo que o projeto principal tenha configurado uma conexão admin
Db::connection('admin')->table('admin')->first();

Configurando banco de dados para o Model

Podemos criar uma classe Base para o Model, e na classe Base, usar $connection para especificar a conexão de banco de dados do próprio plugin, por exemplo:

<?php

namespace plugin\foo\app\model;

use DateTimeInterface;
use support\Model;

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

}

Assim, todos os Models dentro do plugin que herdarem de Base usarão automaticamente o banco de dados do plugin.

Importação automática de banco de dados

Ao executar php webman app-plugin:create foo, o plugin foo será criado automaticamente, incluindo plugin/foo/api/Install.php e plugin/foo/install.sql.

Dica
Se o arquivo install.sql não foi gerado, tente atualizar o webman/console, o comando é composer require webman/console ^1.3.6.

Importando banco de dados na instalação do plugin

Durante a instalação do plugin, o método install em Install.php será executado, e este método importará automaticamente as instruções SQL contidas em install.sql, permitindo a criação automática das tabelas do banco de dados.

O conteúdo do arquivo install.sql consiste na criação de tabelas do banco de dados e em instruções SQL de alterações históricas nas tabelas. Tenha em mente que cada instrução deve terminar com ;, por exemplo:

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chave Primária',
  `order_id` varchar(50) NOT NULL COMMENT 'ID do Pedido',
  `user_id` int NOT NULL COMMENT 'ID do Usuário',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'Valor a Pagar',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Pedidos';

CREATE TABLE `foo_goods` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chave Primária',
  `name` varchar(50) NOT NULL COMMENT 'Nome',
  `price` int NOT NULL COMMENT 'Preço',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Produtos';

Alterando a conexão do banco de dados

O banco de dados alvo padrão para importação pelo install.sql é o banco de dados do webman-admin. Se você quiser importar para outro banco de dados, pode modificar a propriedade $connection em Install.php, por exemplo:

<?php

class Install
{
    // Especifica o banco de dados próprio do plugin
    protected static $connection = 'plugin.admin.mysql';

    // ...
}

Teste

Execute php webman app-plugin:install foo para instalar o plugin, e então verifique o banco de dados; você verá que as tabelas foo_orders e foo_goods foram criadas.

Alterações na estrutura das tabelas durante a atualização do plugin

Às vezes, durante a atualização do plugin, é necessário criar novas tabelas ou alterar a estrutura das tabelas. As instruções correspondentes podem ser simplesmente adicionadas ao final de install.sql, assegurando que cada instrução termine com ;, por exemplo, adicionando uma tabela foo_user e um campo status à tabela foo_orders:

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chave Primária',
  `order_id` varchar(50) NOT NULL COMMENT 'ID do Pedido',
  `user_id` int NOT NULL COMMENT 'ID do Usuário',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'Valor a Pagar',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Pedidos';

CREATE TABLE `foo_goods` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chave Primária',
 `name` varchar(50) NOT NULL COMMENT 'Nome',
 `price` int NOT NULL COMMENT 'Preço',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Produtos';

CREATE TABLE `foo_user` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chave Primária',
 `name` varchar(50) NOT NULL COMMENT 'Nome'
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Usuários';

ALTER TABLE `foo_orders` ADD `status` tinyint NOT NULL DEFAULT 0 COMMENT 'Status';

Durante a atualização, o método update em Install.php será executado; esse método também executará as instruções contidas em install.sql. Se houver novas instruções, elas serão executadas, enquanto instruções antigas serão ignoradas, permitindo assim modificar o banco de dados durante a atualização.

Remoção de banco de dados ao desinstalar o plugin

Ao desinstalar o plugin, o método uninstall em Install.php será chamado, o que analisará automaticamente quais instruções de criação de tabelas estão presentes em install.sql e automaticamente excluirá essas tabelas, possibilitando a remoção das tabelas ao desinstalar o plugin.
Se você quiser que, ao desinstalar, apenas o seu próprio uninstall.sql seja executado, sem que a operação automática de exclusão de tabelas ocorra, basta criar o arquivo plugin/{nome do plugin}/uninstall.sql, de modo que o método uninstall execute apenas as instruções contidas no arquivo uninstall.sql.