Veritabanı

Çoğu eklentinin webman-admin kuracağını göz önünde bulundurarak, webman-admin'in veritabanı yapılandırmasını tekrar kullanmanız önerilir.

Model temel sınıfı plugin\admin\app\model\Base kullanılarak webman-admin'in veritabanı yapılandırması otomatik olarak kullanılacaktır.

<?php

namespace plugin\foo\app\model;

use plugin\admin\app\model\Base;

class Orders extends Base
{
    /**
     * Model ile ilişkili olan tablo.
     *
     * @var string
     */
    protected $table = 'foo_orders';

    /**
     * Tablonun ilişkili olduğu birincil anahtar.
     *
     * @var string
     */
    protected $primaryKey = 'id';

}

Ayrıca plugin.admin.mysql ile webman-admin'in veritabanını da işleyebilirsiniz, örneğin

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

Kendi Veritabanınızı Kullanma

Eklentiler kendi veritabanlarını da tercih edebilir, örneğin plugin/foo/config/database.php içeriği aşağıdaki gibi olabilir

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql bağlantı adı
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'veritabanı',
            'username'    => 'kullanıcı_adı',
            'password'    => 'şifre',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin bağlantı adı
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'veritabanı',
            'username'    => 'kullanıcı_adı',
            'password'    => 'şifre',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

Referans şeklinde Db::connection('plugin.{eklenti}.{bağlantı_adı}'); kullanabilirsiniz, örneğin

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

Ana projenizin veritabanını kullanmak istiyorsanız, doğrudan kullanabilirsiniz, örneğin

use support\Db;
Db::table('user')->first();
// Ana projenin ayrıca admin bağlantısı yapılandırdığını varsayıyoruz
Db::connection('admin')->table('admin')->first();

Model için Veritabanı Yapılandırma

Model için bir Base sınıfı oluşturabiliriz, Base sınıfı $connection ile eklentinin kendi veritabanı bağlantısını belirtebilir, örneğin

<?php

namespace plugin\foo\app\model;

use DateTimeInterface;
use support\Model;

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

}

Bu şekilde, eklentideki tüm Model'ler Base'den miras alarak otomatik olarak eklentinin kendi veritabanını kullanır.

Veritabanını Otomatik Olarak İçe Aktarma

php webman app-plugin:create foo komutunu çalıştırmak, plugin/foo/api/Install.php ve plugin/foo/install.sql içeren foo eklentisini otomatik olarak oluşturacaktır.

İpucu
Eğer install.sql dosyası oluşturulmadıysa webman/console'u güncellemeyi deneyin, komut composer require webman/console ^1.3.6

Eklenti Yüklenirken Veritabanını İçe Aktarma

Eklentiyi yüklerken, Install.php içindeki install metodu çalıştırılacaktır; bu metod, install.sql içindeki SQL ifadelerini otomatik olarak içe aktarır ve böylece veritabanı tablolarının otomatik olarak içe aktarılmasını sağlar.

install.sql dosya içeriği, veritabanı tablolarını oluşturma ve tablonun geçmişteki değişiklikleri için SQL ifadelerini içerir; her ifadenin ; ile bitmesi gerektiğine dikkat edin, örneğin

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
  `order_id` varchar(50) NOT NULL COMMENT 'Sipariş id',
  `user_id` int NOT NULL COMMENT 'Kullanıcı id',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'Ödenecek tutar',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Sipariş';

CREATE TABLE `foo_goods` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
  `name` varchar(50) NOT NULL COMMENT 'İsim',
  `price` int NOT NULL COMMENT 'Fiyat',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Ürün';

Veritabanı Bağlantısını Değiştir

install.sql ile içe aktarılan hedef veritabanı varsayılan olarak webman-admin'in veritabanıdır; başka bir veritabanına içe aktarmak isterseniz, Install.php içindeki $connection özelliğini değiştirebilirsiniz, örneğin

<?php

class Install
{
    // Eklentinin kendi veritabanını belirtir
    protected static $connection = 'plugin.admin.mysql';

    // ...
}

Test

php webman app-plugin:install foo komutunu çalıştırarak eklentiyi yükleyin, ardından veritabanını kontrol edin; foo_orders ve foo_goods tablolarının oluşturulduğunu göreceksiniz.

Eklenti Güncellenirken Tablo Yapısını Değiştirme

Bazen eklenti güncellemesi, yeni tablolar oluşturmayı veya tablo yapısını değiştirmeyi gerektirir; bu durumda, install.sql dosyasının sonuna uygun ifadeleri ekleyebilirsiniz, her ifadenin sonunda ; olmasına dikkat edin; örneğin bir foo_user tablosu ekleyerek foo_orders tablosuna bir status alanı ekleme

CREATE TABLE `foo_orders` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
  `order_id` varchar(50) NOT NULL COMMENT 'Sipariş id',
  `user_id` int NOT NULL COMMENT 'Kullanıcı id',
  `total_amount` decimal(10,2) NOT NULL COMMENT 'Ödenecek tutar',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Sipariş';

CREATE TABLE `foo_goods` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
 `name` varchar(50) NOT NULL COMMENT 'İsim',
 `price` int NOT NULL COMMENT 'Fiyat',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Ürün';

CREATE TABLE `foo_user` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Birincil anahtar',
 `name` varchar(50) NOT NULL COMMENT 'İsim'
 PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='Kullanıcı';

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

Güncelleme sırasında, Install.php'taki update metodu çalıştırılacaktır; bu metod da install.sql içindeki ifadeleri çalıştırır; yeni ifadeler çalıştırılır, eski ifadeler atlanır ve böylece veritabanındaki değişiklikleri gerçekleştirir.

Eklentiyi Kaldırırken Veritabanını Silme

Eklenti kaldırıldığında Install.php'daki uninstall metodu çağrılır; bu metod install.sql içindeki tablo oluşturma ifadelerini analiz eder ve bu tabloları otomatik olarak siler, böylece eklenti kaldırıldığında veritabanı tablolarının silinmesini sağlar.
Eğer kaldırma işleminde yalnızca kendi uninstall.sql dosyanızın çalışmasını, otomatik olarak tablo silme işlemine müdahale etmeyerek istiyorsanız, yalnızca plugin/{eklenti_ismi}/uninstall.sql dosyasını oluşturmanız yeterlidir; bu şekilde uninstall metodu yalnızca uninstall.sql dosyası içindeki ifadeleri çalıştıracaktır.