Base de datos
Dado que la mayoría de los complementos instalarán webman-admin, se recomienda reutilizar directamente la configuración de la base de datos de webman-admin
.
Si la clase base del modelo utiliza plugin\admin\app\model\Base
, automáticamente usará la configuración de la base de datos de webman-admin
.
<?php
namespace plugin\foo\app\model;
use plugin\admin\app\model\Base;
class Orders extends Base
{
/**
* La tabla asociada con el modelo.
*
* @var string
*/
protected $table = 'foo_orders';
/**
* La clave primaria asociada con la tabla.
*
* @var string
*/
protected $primaryKey = 'id';
}
También se puede operar la base de datos de webman-admin
a través de plugin.admin.mysql
, por ejemplo
Db::connection('plugin.admin.mysql')->table('user')->first();
Usando tu propia base de datos
Los complementos también pueden optar por usar su propia base de datos, por ejemplo, el contenido de plugin/foo/config/database.php
es el siguiente
return [
'default' => 'mysql',
'connections' => [
'mysql' => [ // mysql es el nombre de conexión
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'base de datos',
'username' => 'nombre de usuario',
'password' => 'contraseña',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
'admin' => [ // admin es el nombre de conexión
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'base de datos',
'username' => 'nombre de usuario',
'password' => 'contraseña',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
],
];
La forma de citar es Db::connection('plugin.{complemento}.{nombre de conexión}');
, por ejemplo
use support\Db;
Db::connection('plugin.foo.mysql')->table('user')->first();
Db::connection('plugin.foo.admin')->table('admin')->first();
Si deseas usar la base de datos del proyecto principal, simplemente úsala, por ejemplo
use support\Db;
Db::table('user')->first();
// Suponiendo que el proyecto principal también ha configurado una conexión admin
Db::connection('admin')->table('admin')->first();
Configurar la base de datos para el Modelo
Podemos crear una clase Base para el Modelo, la clase Base usa $connection
para especificar la conexión de base de datos de su propio complemento, por ejemplo
<?php
namespace plugin\foo\app\model;
use DateTimeInterface;
use support\Model;
class Base extends Model
{
/**
* @var string
*/
protected $connection = 'plugin.foo.mysql';
}
De esta manera, todos los Modelos dentro del complemento que heredan de Base automáticamente usarán la base de datos de su propio complemento.
Importación automática de la base de datos
Ejecutar php webman app-plugin:create foo
creará automáticamente el complemento foo, que incluye plugin/foo/api/Install.php
y plugin/foo/install.sql
.
Consejo
Si no se generó el archivo install.sql, intente actualizarwebman/console
, el comando escomposer require webman/console ^1.3.6
Importar la base de datos al instalar el complemento
Al instalar el complemento, se ejecutará el método install
en Install.php, y este método importará automáticamente las declaraciones SQL en install.sql
, logrando así la meta de importar automáticamente tablas a la base de datos.
El contenido del archivo install.sql
es la creación de tablas en la base de datos y las declaraciones SQL para modificaciones históricas de la tabla, ten en cuenta que cada declaración debe terminar con ;
, por ejemplo
CREATE TABLE `foo_orders` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Clave primaria',
`order_id` varchar(50) NOT NULL COMMENT 'ID de la orden',
`user_id` int NOT NULL COMMENT 'ID del usuario',
`total_amount` decimal(10,2) NOT NULL COMMENT 'Cantidad a pagar',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Órdenes';
CREATE TABLE `foo_goods` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Clave primaria',
`name` varchar(50) NOT NULL COMMENT 'Nombre',
`price` int NOT NULL COMMENT 'Precio',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Productos';
Cambiar la conexión a la base de datos
La base de datos de destino por defecto para importar desde install.sql
es la base de datos de webman-admin
, si deseas importar a otra base de datos, puedes modificar el atributo $connection
en Install.php
, por ejemplo
<?php
class Install
{
// Especificar la base de datos del complemento
protected static $connection = 'plugin.admin.mysql';
// ...
}
Prueba
Ejecuta php webman app-plugin:install foo
para instalar el complemento, luego revisa la base de datos, verás que las tablas foo_orders
y foo_goods
ya han sido creadas.
Cambiar la estructura de la tabla al actualizar el complemento
A veces, al actualizar el complemento necesitas crear nuevas tablas o cambiar la estructura de tablas, puedes simplemente agregar las declaraciones correspondientes al final de install.sql
, y recuerda que cada declaración debe terminar con ;
, por ejemplo, agregar una tabla foo_user
y un campo status
a la tabla foo_orders
CREATE TABLE `foo_orders` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Clave primaria',
`order_id` varchar(50) NOT NULL COMMENT 'ID de la orden',
`user_id` int NOT NULL COMMENT 'ID del usuario',
`total_amount` decimal(10,2) NOT NULL COMMENT 'Cantidad a pagar',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Órdenes';
CREATE TABLE `foo_goods` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Clave primaria',
`name` varchar(50) NOT NULL COMMENT 'Nombre',
`price` int NOT NULL COMMENT 'Precio',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Productos';
CREATE TABLE `foo_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Clave primaria',
`name` varchar(50) NOT NULL COMMENT 'Nombre'
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Usuario';
ALTER TABLE `foo_orders` ADD `status` tinyint NOT NULL DEFAULT 0 COMMENT 'Estado';
Durante la actualización, se ejecutará el método update
en Install.php, este método también ejecutará las declaraciones en install.sql
, si hay nuevas declaraciones se ejecutarán, si son declaraciones antiguas se saltarán, logrando así realizar modificaciones en la base de datos durante la actualización.
Eliminar la base de datos al desinstalar el complemento
Al desinstalar el complemento, se llamará al método uninstall
en Install.php, que analizará automáticamente qué declaraciones de creación de tabla están presentes en install.sql
y eliminará esas tablas automáticamente, logrando así el propósito de eliminar las tablas de la base de datos al desinstalar el complemento.
Si deseas que al desinstalar solo se ejecute tu propio uninstall.sql
, sin ejecutar la operación automática de eliminación de tablas, solo necesitas crear plugin/{nombre del complemento}/uninstall.sql
, de esta manera el método uninstall
solo ejecutará las declaraciones que estén en el archivo uninstall.sql
.