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 owebman/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
.