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 actualizar webman/console, el comando es composer 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.