Database

Poiché la maggior parte dei plugin installerà webman-admin, è consigliabile riutilizzare la configurazione del database di webman-admin.

Utilizzando il modello di base plugin\admin\app\model\Base, verrà automaticamente utilizzata la configurazione del database di webman-admin.

<?php

namespace plugin\foo\app\model;

use plugin\admin\app\model\Base;

class Orders extends Base
{
    /**
     * La tabella associata al modello.
     *
     * @var string
     */
    protected $table = 'foo_orders';

    /**
     * La chiave primaria associata alla tabella.
     *
     * @var string
     */
    protected $primaryKey = 'id';

}

È possibile anche operare sul database di webman-admin tramite plugin.admin.mysql, come ad esempio

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

Utilizzare il proprio database

I plugin possono anche scegliere di utilizzare il proprio database, ad esempio il contenuto di plugin/foo/config/database.php è il seguente:

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql è il nome della connessione
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => '数据库',
            'username'    => '用户名',
            'password'    => '密码',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin è il nome della connessione
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => '数据库',
            'username'    => '用户名',
            'password'    => '密码',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

Il modo di riferimento è Db::connection('plugin.{plugin}.{nome_connessione}');, ad esempio

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

Se si desidera utilizzare il database del progetto principale, basta utilizzare il seguente comando:

use support\Db;
Db::table('user')->first();
// supponendo che il progetto principale abbia anche configurato una connessione admin
Db::connection('admin')->table('admin')->first();

Configurazione del database per il Model

Possiamo creare una classe Base per il Model, dove Base utilizza $connection per specificare la connessione al database del plugin, ad esempio:

<?php

namespace plugin\foo\app\model;

use DateTimeInterface;
use support\Model;

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

}

In questo modo, tutti i Model all'interno del plugin che ereditano da Base utilizzeranno automaticamente il proprio database.

Importazione automatica del database

Eseguendo php webman app-plugin:create foo, verrà creato automaticamente il plugin foo, che contiene plugin/foo/api/Install.php e plugin/foo/install.sql.

Suggerimento
Se non viene generato il file install.sql, provare ad aggiornare webman/console, il comando è composer require webman/console ^1.3.6

Importazione del database durante l'installazione del plugin

Durante l'installazione del plugin verrà eseguito il metodo install di Install.php, il quale importerà automaticamente le istruzioni SQL presenti in install.sql, permettendo l'importazione automatica delle tabelle del database.

Il contenuto del file install.sql è la creazione delle tabelle del database e le dichiarazioni SQL per le modifiche storiche alle tabelle. È importante notare che ogni istruzione deve terminare con ;, ad esempio:

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chiave primaria',
  `order_id` varchar(50) NOT NULL COMMENT 'ID ordine',
  `user_id` int NOT NULL COMMENT 'ID utente',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'Importo da pagare',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Ordini';

CREATE TABLE `foo_goods` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chiave primaria',
  `name` varchar(50) NOT NULL COMMENT 'Nome',
  `price` int NOT NULL COMMENT 'Prezzo',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Prodotti';

Modifica della connessione al database

Il database di destinazione importato tramite install.sql è predefinito al database di webman-admin. Se si desidera importare in un altro database, è possibile modificare l'attributo $connection in Install.php, ad esempio:

<?php

class Install
{
    // Specifica il database del plugin
    protected static $connection = 'plugin.admin.mysql';

    // ...
}

Test

Eseguire php webman app-plugin:install foo per installare il plugin, quindi controllare il database per verificare che le tabelle foo_orders e foo_goods siano già state create.

Modifica della struttura delle tabelle durante l'aggiornamento del plugin

A volte, durante l'aggiornamento di un plugin, è necessario creare nuove tabelle o modificare la struttura delle tabelle esistenti; è possibile aggiungere direttamente le istruzioni corrispondenti alla fine di install.sql. È importante notare che ogni istruzione deve terminare con ;, ad esempio, per aggiungere una tabella foo_user e un campo status alla tabella foo_orders:

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chiave primaria',
  `order_id` varchar(50) NOT NULL COMMENT 'ID ordine',
  `user_id` int NOT NULL COMMENT 'ID utente',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'Importo da pagare',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Ordini';

CREATE TABLE `foo_goods` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chiave primaria',
 `name` varchar(50) NOT NULL COMMENT 'Nome',
 `price` int NOT NULL COMMENT 'Prezzo',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Prodotti';

CREATE TABLE `foo_user` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Chiave primaria',
 `name` varchar(50) NOT NULL COMMENT 'Nome'
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Utente';

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

Durante l'aggiornamento, verrà eseguito il metodo update in Install.php, che eseguirà anch'esso le istruzioni presenti in install.sql. Se ci sono istruzioni nuove, verranno eseguite, mentre le istruzioni vecchie verranno saltate, permettendo modifiche al database durante l'aggiornamento.

Eliminazione del database durante la disinstallazione del plugin

Durante la disinstallazione del plugin, verrà chiamato il metodo uninstall di Install.php, il quale analizzerà automaticamente le istruzioni di creazione delle tabelle presenti in install.sql e rimuoverà automaticamente queste tabelle, consentendo di eliminare le tabelle del database durante la disinstallazione del plugin.
Se si desidera che durante la disinstallazione venga eseguito solo il proprio uninstall.sql, senza l'operazione automatica di eliminazione delle tabelle, è sufficiente creare plugin/插件名/uninstall.sql, in modo che il metodo uninstall esegua solo le istruzioni presenti nel file uninstall.sql.