데이터베이스

대부분의 플러그인이 webman-admin을 설치하기 때문에, webman-admin의 데이터베이스 구성을 직접 재사용할 것을 권장합니다.

모델의 기본 클래스가 plugin\admin\app\model\Base를 사용하는 경우, 자동으로 webman-admin의 데이터베이스 구성을 사용하게 됩니다.

<?php

namespace plugin\foo\app\model;

use plugin\admin\app\model\Base;

class Orders extends Base
{
    /**
     * 모델과 연관된 테이블.
     *
     * @var string
     */
    protected $table = 'foo_orders';

    /**
     * 테이블과 연관된 기본 키.
     *
     * @var string
     */
    protected $primaryKey = 'id';

}

또한 plugin.admin.mysql을 통해 webman-admin의 데이터베이스를 조작할 수도 있습니다. 예를 들어,

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

자신의 데이터베이스 사용하기

플러그인은 자신의 데이터베이스를 사용할 수도 있습니다. 예를 들어, plugin/foo/config/database.php의 내용은 다음과 같습니다.

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql은 연결 이름
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => '데이터베이스',
            'username'    => '사용자 이름',
            'password'    => '비밀번호',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin은 연결 이름
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => '데이터베이스',
            'username'    => '사용자 이름',
            'password'    => '비밀번호',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

참조 방식은 Db::connection('plugin.{플러그인}.{연결 이름}');입니다. 예를 들어,

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

주 프로젝트의 데이터베이스를 사용하고 싶다면, 직접 사용하면 됩니다. 예를 들면,

use support\Db;
Db::table('user')->first();
// 주 프로젝트에 admin 연결이 추가되어 있다고 가정
Db::connection('admin')->table('admin')->first();

Model에 데이터베이스 구성하기

모델을 위해 Base 클래스를 생성할 수 있습니다. Base 클래스에서 $connection을 사용하여 플러그인 자신의 데이터베이스 연결을 지정합니다. 예를 들어,

<?php

namespace plugin\foo\app\model;

use DateTimeInterface;
use support\Model;

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

}

이렇게 하면 플러그인 내 모든 모델이 Base에서 상속받아 자동으로 플러그인 자신의 데이터베이스를 사용하게 됩니다.

자동으로 데이터베이스 가져오기

php webman app-plugin:create foo를 실행하면 foo 플러그인이 자동으로 생성되며, 여기에는 plugin/foo/api/Install.phpplugin/foo/install.sql이 포함됩니다.


install.sql 파일이 생성되지 않았다면 webman/console을 업그레이드해보세요. 명령어는 composer require webman/console ^1.3.6입니다.

플러그인 설치 시 데이터베이스 가져오기

플러그인을 설치하면 Install.phpinstall 메서드가 실행됩니다. 이 메서드는 자동으로 install.sql의 SQL 문을 가져와서 데이터베이스 테이블을 자동으로 가져옵니다.

install.sql 파일의 내용은 데이터베이스 테이블을 생성하고 테이블의 수정 이력을 나타내는 SQL 문입니다. 각 문장은 반드시 ;로 끝나야 합니다. 예를 들면,

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '기본 키',
  `order_id` varchar(50) NOT NULL COMMENT '주문 id',
  `user_id` int NOT NULL COMMENT '사용자 id',
  `total_amount` decimal(10,2) NOT NULL COMMENT '지불해야 할 금액',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='주문';

CREATE TABLE `foo_goods` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '기본 키',
  `name` varchar(50) NOT NULL COMMENT '이름',
  `price` int NOT NULL COMMENT '가격',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='상품';

데이터베이스 연결 변경

install.sql로 가져오는 대상 데이터베이스는 기본적으로 webman-admin 데이터베이스입니다. 다른 데이터베이스에 가져오고 싶다면 Install.php$connection 속성을 수정할 수 있습니다. 예를 들어,

<?php

class Install
{
    // 플러그인 자신의 데이터베이스 지정
    protected static $connection = 'plugin.admin.mysql';

    // ...
}

테스트

php webman app-plugin:install foo를 실행하여 플러그인을 설치한 후, 데이터베이스를 확인하면 foo_ordersfoo_goods 테이블이 생성된 것을 볼 수 있습니다.

플러그인 업그레이드 시 테이블 구조 변경

때때로 플러그인 업그레이드 과정에서 새로운 테이블을 생성하거나 테이블 구조를 변경해야 할 수 있습니다. install.sql 뒤에 해당하는 문장을 추가하면 됩니다. 각 문장 뒤에 ;를 추가해야 합니다. 예를 들어 foo_user 테이블을 추가하고 foo_orders 테이블에 status 필드를 추가하는 경우:

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '기본 키',
  `order_id` varchar(50) NOT NULL COMMENT '주문 id',
  `user_id` int NOT NULL COMMENT '사용자 id',
  `total_amount` decimal(10,2) NOT NULL COMMENT '지불해야 할 금액',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='주문';

CREATE TABLE `foo_goods` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT '기본 키',
 `name` varchar(50) NOT NULL COMMENT '이름',
 `price` int NOT NULL COMMENT '가격',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='상품';

CREATE TABLE `foo_user` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT '기본 키',
 `name` varchar(50) NOT NULL COMMENT '이름'
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='사용자';

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

업그레이드 시 Install.phpupdate 메서드가 실행되며, 이 메서드 또한 install.sql의 문장을 실행합니다. 새로운 문장이 있으면 새 문장이 실행되고, 이전 문장은 건너뛰어 데이터베이스 수정이 이루어집니다.

플러그인 제거 시 데이터베이스 삭제

플러그인을 제거할 때 Install.phpuninstall 메서드가 호출됩니다. 이 메서드는 자동으로 install.sql에서 어떤 테이블 생성 문장이 있는지 분석하고 이러한 테이블을 자동으로 삭제하여 플러그인 제거 시 데이터베이스 테이블을 삭제합니다.
제거할 때 자신