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ıysawebman/console
'u güncellemeyi deneyin, komutcomposer 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.