Base de données

Étant donné que la plupart des plugins installeront webman-admin, il est recommandé de réutiliser directement la configuration de la base de données de webman-admin.

La classe de base du modèle utilisant plugin\admin\app\model\Base utilisera automatiquement la configuration de la base de données de webman-admin.

<?php

namespace plugin\foo\app\model;

use plugin\admin\app\model\Base;

class Orders extends Base
{
    /**
     * La table associée au modèle.
     *
     * @var string
     */
    protected $table = 'foo_orders';

    /**
     * La clé primaire associée à la table.
     *
     * @var string
     */
    protected $primaryKey = 'id';

}

Il est également possible d'opérer la base de données de webman-admin via plugin.admin.mysql, par exemple

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

Utiliser sa propre base de données

Le plugin peut également choisir d'utiliser sa propre base de données, par exemple, le contenu de plugin/foo/config/database.php est le suivant

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql est le nom de la connexion
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'base_de_données',
            'username'    => 'nom_d_utilisateur',
            'password'    => 'mot_de_passe',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin est le nom de la connexion
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'base_de_données',
            'username'    => 'nom_d_utilisateur',
            'password'    => 'mot_de_passe',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

La façon de faire référence est Db::connection('plugin.{plugin}.{nom_de_connexion}');, par exemple

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

Si vous souhaitez utiliser la base de données du projet principal, il suffit de l'utiliser directement, par exemple

use support\Db;
Db::table('user')->first();
// Supposons que le projet principal a également configuré une connexion admin
Db::connection('admin')->table('admin')->first();

Configurer la base de données pour le modèle

Nous pouvons créer une classe Base pour le modèle, la classe Base spécifiant la connexion de la base de données de son propre plugin avec $connection, par exemple

<?php

namespace plugin\foo\app\model;

use DateTimeInterface;
use support\Model;

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

}

Ainsi, tous les modèles dans le plugin qui héritent de Base utiliseront automatiquement la base de données de leur propre plugin.

Importation automatique de la base de données

Exécuter php webman app-plugin:create foo créera automatiquement le plugin foo, qui contient plugin/foo/api/Install.php et plugin/foo/install.sql.

Astuce
Si le fichier install.sql n'est pas généré, veuillez essayer de mettre à jour webman/console avec la commande composer require webman/console ^1.3.6

Importation de la base de données lors de l'installation du plugin

Lors de l'installation du plugin, la méthode install dans Install.php sera exécutée, cette méthode importera automatiquement les instructions SQL dans install.sql, réalisant ainsi l'importation automatique des tables de la base de données.

Le contenu du fichier install.sql est la création de tables dans la base de données ainsi que des instructions SQL pour les modifications historiques des tables, notez que chaque instruction doit se terminer par ;, par exemple

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'clé primaire',
  `order_id` varchar(50) NOT NULL COMMENT 'id de la commande',
  `user_id` int NOT NULL COMMENT 'id de l'utilisateur',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'montant à payer',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='commande';

CREATE TABLE `foo_goods` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'clé primaire',
  `name` varchar(50) NOT NULL COMMENT 'nom',
  `price` int NOT NULL COMMENT 'prix',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='produit';

Modifier la connexion à la base de données

La base de données cible par défaut pour l'importation de install.sql est la base de données de webman-admin. Si vous souhaitez l'importer dans une autre base de données, vous pouvez modifier l'attribut $connection dans Install.php, par exemple

<?php

class Install
{
    // Spécifiez la base de données de votre propre plugin
    protected static $connection = 'plugin.admin.mysql';

    // ...
}

Test

Exécutez php webman app-plugin:install foo pour installer le plugin, puis vérifiez la base de données ; vous verrez que les tables foo_orders et foo_goods ont déjà été créées.

Modification de la structure des tables lors de la mise à niveau du plugin

Parfois, une mise à niveau du plugin nécessite de créer de nouvelles tables ou de modifier la structure des tables. Vous pouvez simplement ajouter les instructions correspondantes après install.sql, en notant que chaque instruction doit se terminer par ;, par exemple l'ajout d'une table foo_user et l'ajout d'un champ status à la table foo_orders

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'clé primaire',
  `order_id` varchar(50) NOT NULL COMMENT 'id de la commande',
  `user_id` int NOT NULL COMMENT 'id de l'utilisateur',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'montant à payer',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='commande';

CREATE TABLE `foo_goods` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'clé primaire',
 `name` varchar(50) NOT NULL COMMENT 'nom',
 `price` int NOT NULL COMMENT 'prix',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='produit';

CREATE TABLE `foo_user` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'clé primaire',
 `name` varchar(50) NOT NULL COMMENT 'nom'
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='utilisateur';

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

Lors de la mise à niveau, la méthode update dans Install.php sera exécutée ; cette méthode exécutera également les instructions dans install.sql. Les nouvelles instructions seront exécutées, tandis que les anciennes instructions seront ignorées, permettant ainsi d'appliquer les modifications à la base de données lors de la mise à niveau.

Supprimer la base de données lors de la désinstallation du plugin

Lors de la désinstallation du plugin, la méthode uninstall dans Install.php sera appelée, elle analysera automatiquement les instructions de création de tables présentes dans install.sql et supprimera automatiquement ces tables, atteignant ainsi l'objectif de supprimer les tables de la base de données lors de la désinstallation du plugin.
Si vous souhaitez n'exécuter que votre propre uninstall.sql lors de la désinstallation et éviter l'opération automatique de suppression des tables, il suffit de créer un fichier plugin/nom_du_plugin/uninstall.sql. Ainsi, la méthode uninstall n'exécutera que les instructions présentes dans le fichier uninstall.sql.