Paket PHP yang mudah digunakan untuk memperbarui skema database aplikasi Anda dan memigrasikan data antar versi.
composer req aimeos/upscheme
Daftar isi
Migrasi seperti kontrol versi untuk database Anda. Mereka memungkinkan Anda mendapatkan status yang sama persis di setiap instalasi. Dengan menggunakan Upscheme, Anda mendapatkan:
Berikut ini contoh definisi tabel yang dapat Anda sesuaikan kapan pun tata letak tabel Anda harus berubah. Kemudian, Upscheme akan secara otomatis menambahkan dan mengubah properti kolom dan tabel yang ada (tetapi jangan menghapus apa pun demi alasan keamanan):
$ this -> db ()-> table ( ' test ' , function ( $ t ) {
$ t -> engine = ' InnoDB ' ;
$ t -> id ();
$ t -> string ( ' domain ' , 32 );
$ t -> string ( ' code ' , 64 )-> opt ( ' charset ' , ' binary ' , [ ' mariadb ' , ' mysql ' ] );
$ t -> string ( ' label ' , 255 );
$ t -> int ( ' pos ' )-> default ( 0 );
$ t -> smallint ( ' status ' );
$ t -> default ();
$ t -> unique ( [ ' domain ' , ' code ' ] );
$ t -> index ( [ ' status ' , ' pos ' ] );
} );
Untuk memutakhirkan skema basis data relasional, dua paket yang paling sering digunakan saat ini: Doctrine DBAL dan migrasi Doctrine. Meskipun Doctrine DBAL berfungsi dengan baik dalam mengabstraksi perbedaan dari beberapa implementasi database, API-nya memerlukan penulisan banyak kode. Migrasi doktrin di situs lain memiliki beberapa kekurangan sehingga sulit digunakan di semua aplikasi yang mendukung ekstensi pihak ketiga.
API DBAL sangat bertele-tele dan Anda perlu menulis banyak kode bahkan untuk hal-hal sederhana. Upscheme menggunakan Doctrine DBAL untuk menawarkan API yang mudah digunakan untuk meningkatkan skema database aplikasi Anda dengan kode minimal. Untuk contoh Upscheme di atas, baris kode berikut setara dengan DBAL dalam migrasi:
$ dbalManager = $ conn -> createSchemaManager ();
$ from = $ manager -> createSchema ();
$ to = $ manager -> createSchema ();
if ( $ to -> hasTable ( ' test ' ) ) {
$ table = $ to -> getTable ( ' test ' );
} else {
$ table = $ to -> createTable ( ' test ' );
}
$ table -> addOption ( ' engine ' , ' InnoDB ' );
$ table -> addColumn ( ' id ' , ' integer ' , [ ' autoincrement ' => true ] );
$ table -> addColumn ( ' domain ' , ' string ' , [ ' length ' => 32 ] );
$ platform = $ conn -> getDatabasePlatform ();
if ( $ platform instanceof Doctrine DBAL Platform MySQLPlatform
|| $ platform instanceof Doctrine DBAL Platform MariaDBPlatform
) {
$ table -> addColumn ( ' code ' , ' string ' , [ ' length ' => 64 , ' customSchemaOptions ' => [ ' charset ' => ' binary ' ]] );
} else {
$ table -> addColumn ( ' code ' , ' string ' , [ ' length ' => 64 ]] );
}
$ table -> addColumn ( ' label ' , ' string ' , [ ' length ' => 255 ] );
$ table -> addColumn ( ' pos ' , ' integer ' , [ ' default ' => 0 ] );
$ table -> addColumn ( ' status ' , ' smallint ' , [] );
$ table -> addColumn ( ' mtime ' , ' datetime ' , [] );
$ table -> addColumn ( ' ctime ' , ' datetime ' , [] );
$ table -> addColumn ( ' editor ' , ' string ' , [ ' length ' => 255 ] );
$ table -> setPrimaryKey ( [ ' id ' ] );
$ table -> addUniqueIndex ( [ ' domain ' , ' code ' ] );
$ table -> addIndex ( [ ' status ' , ' pos ' ] );
foreach ( $ from -> getMigrateToSql ( $ to , $ conn -> getDatabasePlatform () ) as $ sql ) {
$ conn -> executeStatement ( $ sql );
}
Migrasi Doktrin bergantung pada kelas migrasi yang diberi nama pada saat kelas tersebut dibuat untuk memastikan tatanan tertentu. Selain itu, ia menyimpan migrasi mana yang telah dijalankan dalam tabel database Anda. Ada tiga masalah besar yang timbul dari hal itu:
down()
Jika aplikasi Anda mendukung ekstensi pihak ketiga, ekstensi ini kemungkinan akan menambahkan kolom ke tabel yang ada dan memigrasikan data itu sendiri. Karena tidak ada cara untuk menentukan ketergantungan antar migrasi, hampir tidak mungkin menjalankan migrasi dalam aplikasi dengan beberapa ekstensi pihak ketiga tanpa konflik. Untuk menghindari hal tersebut, Upscheme menawarkan metode before()
dan after()
yang mudah digunakan di setiap tugas migrasi di mana tugas tersebut dapat menentukan ketergantungannya pada tugas lain.
Karena Migrasi Doktrin menggunakan tabel database untuk mencatat migrasi mana yang telah dijalankan, catatan ini dapat dengan mudah menjadi tidak sinkron jika terjadi masalah. Sebaliknya, Upscheme hanya mengandalkan skema aktual sehingga memungkinkan untuk melakukan upgrade dari status mana pun, apa pun yang telah terjadi sebelumnya.
Migrasi Doktrin juga mendukung operasi kebalikan dalam metode down()
sehingga Anda dapat mengembalikan migrasi yang tidak dimiliki Upscheme. Pengalaman menunjukkan bahwa sering kali tidak mungkin untuk membatalkan migrasi, misalnya setelah menambahkan kolom baru, memigrasikan data kolom yang sudah ada, dan menghapus kolom lama setelahnya. Jika migrasi data mengalami kerugian, Anda tidak dapat membuat ulang status yang sama dalam metode down()
. Hal yang sama berlaku jika Anda menjatuhkan meja. Oleh karena itu, Upscheme hanya menawarkan peningkatan skema tetapi tidak ada penurunan versi untuk menghindari kehilangan data implisit.
Upscheme menggunakan Doctrine DBAL untuk mengabstraksi dari implementasi server database yang berbeda. DBAL mendukung semua sistem manajemen basis data relasional utama (RDBMS) namun dengan tingkat dukungan berbeda untuk fitur yang tersedia:
Dukungan yang bagus:
Dukungan terbatas:
Setelah Anda menginstal paket aimeos/upscheme
menggunakan composer, Anda dapat menggunakan kelas Up
untuk menjalankan tugas migrasi Anda:
$ config = [
' driver ' => ' pdo_mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' dbname ' => ' <database> ' ,
' user ' => ' <dbuser> ' ,
' password ' => ' <secret> '
];
Aimeos Upscheme Up:: use ( $ config , ' src/migrations ' )-> up ();
Metode Up::use()
memerlukan dua parameter: Konfigurasi database dan jalur ke tugas migrasi. Untuk konfigurasinya, kunci array dan nilai driver harus didukung oleh Doctrine DBAL. Driver yang tersedia adalah:
Beberapa database memerlukan parameter yang berbeda, yang paling terkenal adalah SQLite dan Oracle:
SQLite:
$ config = [
' driver ' => ' pdo_sqlite ' ,
' path ' => ' path/to/file.sq3 '
];
Peramal:
$ config = [
' driver ' => ' pdo_oci ' ,
' host ' => ' <host or IP> ' ,
' dbname ' => ' <SID or service name (Oracle 18+)> ' ,
' service ' => true , // for Oracle 18 + only
' user ' => ' <dbuser> ' ,
' password ' => ' <secret> '
];
Jika Anda tidak menggunakan Doctrine DBAL sebelumnya, konfigurasi database Anda mungkin memiliki struktur berbeda dan/atau menggunakan nilai berbeda untuk tipe database. Upscheme memungkinkan Anda mendaftarkan metode khusus yang mengubah konfigurasi Anda menjadi pengaturan DBAL yang valid, misalnya:
Aimeos Upscheme Up:: macro ( ' connect ' , function ( array $ cfg ) {
return Doctrine DBAL DriverManager:: getConnection ( [
' driver ' => $ cfg [ ' adapter ' ],
' host ' => $ cfg [ ' host ' ],
' dbname ' => $ cfg [ ' database ' ],
' user ' => $ cfg [ ' username ' ],
' password ' => $ cfg [ ' password ' ]
] );
} );
Upscheme juga mendukung beberapa koneksi database yang dapat Anda bedakan berdasarkan nama kuncinya:
$ config = [
' db ' => [
' driver ' => ' pdo_mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' dbname ' => ' <database> ' ,
' user ' => ' <dbuser> ' ,
' password ' => ' <secret> '
],
' temp ' => [
' driver ' => ' pdo_sqlite ' ,
' path ' => ' /tmp/mydb.sqlite '
]
];
Aimeos Upscheme Up:: use ( $ config , ' src/migrations ' )-> up ();
Tentu saja, Anda juga dapat melewati beberapa jalur migrasi ke kelas Up
:
Aimeos Upscheme Up:: use ( $ config , [ ' src/migrations ' , ' ext/migrations ' ] )-> up ();
Untuk mengaktifkan keluaran (debugging), gunakan metode verbose():
Aimeos Upscheme Up:: use ( $ config , ' src/migrations ' )-> verbose ()-> up (); // most important only
Aimeos Upscheme Up:: use ( $ config , ' src/migrations ' )-> verbose ( ' vv ' )-> up (); // more verbose
Aimeos Upscheme Up:: use ( $ config , ' src/migrations ' )-> verbose ( ' vvv ' )-> up (); // debugging
Tugas migrasi hanya memerlukan penerapan metode up()
dan harus disimpan di salah satu direktori yang diteruskan ke kelas Up
:
<?php
namespace Aimeos Upscheme Task ;
use Aimeos Upscheme Schema Table ;
return new class ( $ this ) extends Base {
public function up ()
{
$ this -> db ()-> table ( ' test ' , function ( Table $ t ) {
$ t -> id ();
$ t -> string ( ' label ' );
$ t -> bool ( ' status ' );
} );
}
};
Dalam file PHP Anda, selalu sertakan pernyataan namespace
terlebih dahulu. Pernyataan use
bersifat opsional dan hanya diperlukan sebagai pintasan untuk petunjuk tipe untuk argumen fungsi penutupan. Kelas Anda juga harus diperluas dari kelas tugas "Dasar" atau mengimplementasikan antarmuka tugas "Iface".
Sebagai alternatif dari kelas anonim, Anda dapat menggunakan kelas bernama untuk tugas migrasi:
<?php
namespace Aimeos Upscheme Task ;
use Aimeos Upscheme Schema Table ;
class TestTable extends Base
{
public function up ()
{
$ this -> db ()-> table ( ' test ' , function ( Table $ t ) {
$ t -> id ();
$ t -> string ( ' label ' );
$ t -> bool ( ' status ' );
} );
}
}
File tempat kelas Anda disimpan harus memiliki nama yang sama (peka huruf besar-kecil) dengan kelas itu sendiri dan akhiran .php
, misalnya:
class TestTable -> TestTable.php
Tidak ada konvensi ketat tentang cara memberi nama file tugas migrasi. Anda dapat memberi nama berdasarkan aktivitasnya (misalnya "CreateTestTable.php"), apa yang mereka operasikan (misalnya "TestTable.php") atau bahkan menggunakan stempel waktu (misalnya "20201231_Test.php").
Jika tugas tidak mengandung dependensi, tugas tersebut diurutkan dan dieksekusi dalam urutan abjad sesuai dengan nama file dan pengurutannya adalah:
20201231_Test.php
CreateTestTable.php
TestTable.php
Untuk menentukan dependensi pada tugas migrasi lainnya, gunakan metode after()
dan before()
. Tugas Anda dijalankan setelah tugas dikembalikan oleh after()
dan sebelum tugas dikembalikan oleh before()
:
return new class ( $ this ) extends Base {
public function after () : array
{
return [ ' CreateRefTable ' ];
}
public function before () : array
{
return [ ' InsertTestData ' ];
}
}
Nama tugas adalah nama file tugas tanpa akhiran .php
. Jika contoh migrasi disimpan dalam file TestTable.php
, urutan eksekusinya adalah:
CreateRefTable.php -> TestTable.php -> InsertTestData.php
Untuk menampilkan pesan dalam tugas migrasi Anda, gunakan metode info()
:
$ this -> info ( ' some message ' );
$ this -> info ( ' more verbose message ' , ' vv ' );
$ this -> info ( ' very verbose debug message ' , ' vvv ' );
Parameter kedua adalah tingkat verbositas dan tidak ada atau v
adalah pesan standar, vv
adalah pesan yang hanya ditampilkan jika diinginkan lebih banyak verbositas sedangkan vvv
untuk men-debug pesan. Ada juga parameter ketiga untuk membuat indentasi pesan:
$ this -> info ( ' some message ' );
$ this -> info ( ' second level message ' , ' v ' , 1 );
$ this -> info ( ' third level message ' , ' v ' , 2 );
Ini akan menampilkan:
some message
second level message
third level message
Prasyaratnya adalah metode verbose()
kelas Up
telah dipanggil sebelumnya:
Aimeos Upscheme Up:: use ( $ config , ' ... ' )-> verbose ()-> up ();
Dalam metode up()
, Anda memiliki akses ke skema database menggunakan metode db()
. Jika Anda meneruskan lebih dari satu konfigurasi database ke Up::use()
, Anda dapat mengakses skema yang berbeda berdasarkan kunci konfigurasinya:
// $config = [ 'db' => [ ... ] , 'temp' => [ ... ] ] ;
// Aimeos UpschemeUp::use( $config , '...' )->up() ;
$ this -> db ();
$ this -> db ( ' db ' );
$ this -> db ( ' temp ' );
Jika Anda tidak memberikan kunci konfigurasi atau kunci yang tidak ada, konfigurasi pertama akan dikembalikan ("db" dalam kasus ini). Dengan menggunakan metode objek skema database yang tersedia, Anda dapat menambahkan, memperbarui, atau menghapus tabel, kolom, indeks, dan objek database lainnya. Selain itu, Anda dapat menggunakan insert()
, select()
, update()
, delete()
dan stmt()
untuk memanipulasi catatan tabel.
Setelah setiap tugas migrasi, pembaruan skema yang dibuat dalam tugas tersebut secara otomatis diterapkan ke database. Jika Anda perlu segera mempertahankan perubahan karena ingin memasukkan data, panggil sendiri $this->db()->up()
. Metode up()
juga tersedia di objek tabel, urutan, dan kolom mana pun sehingga Anda dapat memanggil up()
di mana saja.
Jika Anda memerlukan dua koneksi database yang berbeda karena Anda ingin menjalankan pernyataan SELECT dan INSERT/UPDATE/DELETE secara bersamaan, berikan TRUE sebagai parameter kedua ke db()
untuk mendapatkan skema database termasuk koneksi baru:
$ db1 = $ this -> db ();
$ db2 = $ this -> db ( ' db ' , true );
foreach ( $ db1 -> select ( ' users ' , [ ' status ' => false ] ) as $ row ) {
$ db2 -> insert ( ' oldusers ' , $ row );
}
$ db2 -> delete ( ' users ' , [ ' status ' => false ] );
Semua perubahan skema yang dilakukan diterapkan ke database sebelum skema dengan koneksi baru dikembalikan. Untuk menghindari koneksi database menumpuk hingga server database menolak koneksi baru, selalu panggil close()
untuk koneksi baru yang dibuat oleh db( '<name>', true )
:
$ db2 -> close ();
Daripada menulis migrasi untuk objek database secara manual, Anda dapat membuat file migrasi secara otomatis menggunakan:
$ config = [
' db ' => [
' driver ' => ' pdo_mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' dbname ' => ' <database> ' ,
' user ' => ' <dbuser> ' ,
' password ' => ' <secret> '
]
];
Aimeos Upscheme Up:: use ( $ config , ' migrations ' )-> create ();
Ini akan menghasilkan satu file untuk setiap urutan, tabel, dan tampilan di direktori yang diteruskan ( ./migrations/
dalam contoh ini). Jika Anda memiliki beberapa database dan ingin membuat migrasi untuk semuanya sekaligus, teruskan kunci koneksi dari konfigurasi ke create()
:
$ config = [
' db ' => [
' driver ' => ' pdo_mysql ' ,
// ...
],
' order ' => [
' driver ' => ' pdo_oci ' ,
// ...
]
];
Aimeos Upscheme Up:: use ( $ config , ' migrations ' )-> create ( [ ' db ' , ' order ' ] );
Anda mendapatkan objek skema database dalam tugas Anda dengan memanggil $this->db()
seperti yang dijelaskan di bagian skema. Ini memberi Anda akses penuh ke skema database termasuk semua tabel, urutan, dan objek skema lainnya:
$ table = $ this -> db ()-> table ( ' users ' );
$ seq = $ this -> db ()-> sequence ( ' seq_users ' );
Jika tabel atau urutannya tidak ada, maka akan dibuat. Jika tidak, objek tabel atau urutan yang ada akan dikembalikan. Dalam kedua kasus tersebut, Anda dapat memodifikasi objek setelahnya dan misalnya menambahkan kolom baru ke tabel.
Anda dapat menguji tabel, kolom, indeks, kunci asing, dan urutan menggunakan skema database yang dikembalikan oleh $this->db()
:
$ db = $ this -> db ();
if ( $ db -> hasTable ( ' users ' ) ) {
// The "users" table exists
}
if ( $ db -> hasColumn ( ' users ' , ' name ' ) ) {
// The "name" column in the "users" table exists
}
if ( $ db -> hasIndex ( ' users ' , ' idx_name ' ) ) {
// The "idx_name" index in the "users" table exists
}
if ( $ db -> hasForeign ( ' users_address ' , ' fk_users_id ' ) ) {
// The foreign key "fk_users_id" in the " users_address " table exists
}
if ( $ db -> hasSequence ( ' seq_users ' ) ) {
// The "seq_users" sequence exists
}
if ( $ db -> hasView ( ' testview ' ) ) {
// The "testview" view exists
}
Objek database yang dikembalikan oleh $this->db()
menawarkan kemungkinan untuk mengganti nama tabel, kolom, dan indeks menggunakan renameTable()
, renameColumn()
dan renameIndex()
:
$ db = $ this -> db ();
// Renames the table "users" to "accounts"
$ db -> renameTable ( ' users ' , ' account ' );
// Renames the column "label" to "name" in the "users" table
$ db -> renameColumn ( ' users ' , ' label ' , ' name ' );
// Renames the column "idx_label" to "idx_name" in the "users" table
$ db -> renameIndex ( ' users ' , ' idx_label ' , ' idx_name ' );
Objek database yang dikembalikan oleh $this->db()
juga memiliki metode untuk menghapus tabel, kolom, indeks, kunci asing, dan urutan:
$ db = $ this -> db ();
// Drops the foreign key " fk_users_id " from the " users_address " table
$ db -> dropForeign ( ' users_address ' , ' fk_users_id ' );
// Drops the " idx_name " index from the " users " table
$ db -> dropIndex ( ' users ' , ' idx_name ' );
// Drops the " name " column from the " users " table
$ db -> dropColumn ( ' users ' , ' name ' );
// Drops the "seq_users" sequence
$ db -> dropSequence ( ' seq_users ' );
// Drops the "users" table
$ db -> dropTable ( ' users ' );
// Drops the "testview" view
$ db -> dropView ( ' testview ' );
Jika tabel, kolom, indeks, kunci asing, atau urutan tidak ada, maka akan diabaikan secara diam-diam. Untuk kasus di mana Anda perlu mengetahui apakah ada, gunakan metode hasTable()
, hasColumn()
, hasIndex()
, hasForeign()
dan hasSeqence()
sebelumnya seperti yang dijelaskan di bagian "Memeriksa keberadaan".
Metode insert()
, select()
, update()
dan delete()
adalah cara mudah untuk menambah, mengambil, memodifikasi dan menghapus baris di tabel mana pun:
$ this -> db ()-> transaction ( function ( $ db ) {
$ db2 = $ this -> db ( ' db ' , true );
foreach ( $ db2 -> select ( ' users ' , [ ' status ' => false ] ) as $ row )
{
$ db -> insert ( ' newusers ' , [ ' userid ' => $ row [ ' id ' ], ' status ' => true ] );
$ db -> update ( ' users ' , [ ' refid ' => $ db -> lastId ()], [ ' id ' => $ row [ ' id ' ]] );
}
$ db -> delete ( ' newusers ' , [ ' status ' => false ] );
$ db2 -> close ();
} );
Jika Anda menggunakan select()
secara bersamaan dengan insert()
, update()
atau delete()
, Anda harus membuat koneksi database kedua karena pernyataan select()
akan mengembalikan baris saat Anda mengirim perintah baru ke server database. Ini hanya berfungsi pada koneksi terpisah, tidak pada koneksi yang sama.
Untuk menggabungkan semua operasi hapus/masukkan/perbarui ke dalam transaksi, Anda harus menggunakan metode transaction()
dari objek database:
$ this -> db ()-> transaction ( function ( $ db ) {
// $db- > insert ( ... )
// $db- > update ( ... )
// $db- > delete ( ... )
} );
Hal ini memastikan bahwa semua operasi penulisan dilakukan secara atomik atau tidak sama sekali jika terjadi kesalahan. Metode transaction()
memastikan bahwa transaksi dikomit atau dibatalkan secara otomatis setelah fungsi anonim Anda mengembalikan kontrol ke metode tersebut.
Jika Anda memerlukan parameter tambahan dalam fungsi anonim Anda, Anda dapat menyerahkannya ke daftar use
fungsi Anda:
$ userid = 123 ;
$ this -> db ()-> transaction ( function ( $ db ) use ( $ userid ) {
$ db -> insert ( ' newusers ' , [ ' userid ' => userid, ' status ' => true ] );
} );
Anda hanya dapat meneruskan pasangan kunci/nilai sederhana untuk kondisi ke metode yang digabungkan oleh AND. Jika Anda memerlukan pertanyaan yang lebih kompleks, gunakan stmt()
sebagai gantinya:
$ db = $ this -> db ();
$ result = $ db -> stmt ()-> select ( ' id ' , ' name ' )
-> from ( ' users ' )
-> where ( ' status != ? ' )
-> setParameter ( 0 , false )
-> executeQuery ();
$ db -> stmt ()-> delete ( ' users ' )
-> where ( ' status != ? ' )
-> setParameter ( 0 , false )
-> executeStatement ();
$ db -> stmt ()-> update ( ' users ' )
-> set ( ' status ' , ' ? ' )
-> where ( ' status != ? ' )
-> setParameters ( [ true , false ] )
-> executeStatement ();
Metode stmt()
mengembalikan objek DoctrineDBALQueryQueryBuilder
yang memungkinkan Anda membuat pernyataan lebih lanjut. Silakan lihat dokumentasi Pembuat Kueri Doktrin untuk detail lebih lanjut.
Jika Anda ingin menggunakan nilai secara langsung dalam pernyataan SQL (gunakan pernyataan yang telah disiapkan untuk alasan keamanan bila memungkinkan!), Anda harus mengutip nilai menggunakan metode q()
:
$ db = $ this -> db ();
$ result = $ db -> stmt ()-> select ( ' * ' )-> from ( ' products ' )
-> where ( ' status = ' . $ db -> q ( $ _GET [ ' status ' ] ) )-> executeQuery ();
Demikian pula, jika skema Anda berisi kata kunci khusus, misalnya sebagai nama kolom, Anda juga harus mengutipnya menggunakan metode qi()
:
$ db = $ this -> db ();
$ result = $ db -> stmt ()-> select ( $ db -> qi ( ' key ' ) )-> from ( ' products ' )-> executeQuery ();
Doctrine hanya mendukung subset umum dari pernyataan SQL dan tidak semua kemungkinan yang diterapkan oleh vendor database. Untuk menghilangkan batasan tersebut, Upscheme menawarkan metode exec()
, for()
dan query()
untuk mengeksekusi pernyataan SQL khusus yang tidak didukung oleh Doctrine DBAL.
Untuk mengeksekusi kueri SQL khusus, gunakan metode query()
yang mengembalikan kumpulan hasil yang dapat Anda ulangi:
$ sql = ' SELECT id, label, status FROM product WHERE label LIKE ? ' ;
$ result = $ this -> db ()-> query ( $ sql , [ ' test% ' ] );
foreach ( $ result -> iterateAssociative () as $ row ) {
// ...
}
Untuk semua pernyataan SQL lainnya gunakan metode exec()
yang mengembalikan jumlah baris yang terpengaruh:
$ sql = ' UPDATE product SET status=? WHERE status=? ' ;
$ num = $ this -> db ()-> exec ( $ sql , [ 1 , 0 ] );
Dengan menggunakan metode for()
, Anda juga dapat mengeksekusi pernyataan tergantung pada platform database:
$ this -> db ()-> for ( ' mysql ' , ' CREATE FULLTEXT INDEX idx_text ON product (text) ' );
Menentukan platform database sangat berguna untuk membuat tipe indeks khusus yang sintaksnya berbeda antara implementasi database.
Memanggil metode khusus atau meneruskan panggilan metode yang tidak diketahui ke objek skema Doktrin
public function __call( string $ method , array $ args )
$method
Nama metode$args
Parameter metodeContoh:
Anda dapat mendaftarkan metode khusus yang memiliki akses ke properti kelas objek DB Upscheme:
Aimeos Upscheme Schema DB :: macro ( ' hasFkIndexes ' , function ( $ val ) {
return $ this -> to -> hasExplicitForeignKeyIndexes ();
} );
$ db -> hasFkIndexes ();
// returns true / false
Properti kelas yang tersedia adalah:
$this->from
: Skema database Doktrin Asli yang mewakili database saat ini
$this->to
: Skema database doktrin yang berisi perubahan yang dilakukan hingga saat ini
$this->conn
: Koneksi database doktrin
$this->up
: Objek skema tambahan
Selanjutnya, Anda dapat memanggil metode skema Doktrin apa pun secara langsung, misalnya:
$ db -> hasExplicitForeignKeyIndexes ();
Menutup koneksi database
public function close() : void
Panggil close()
hanya untuk objek skema DB yang dibuat dengan $this->db( '...', true )
. Jika tidak, Anda akan menutup koneksi utama dan DBAL harus menyambung kembali ke server yang akan menurunkan kinerja!
Contoh:
$ db = $ this -> db ( ' temp ' , true );
$ db -> dropTable ( ' test ' );
$ db -> close ();
Menghapus catatan dari tabel yang diberikan
public function delete( string $ table , array $ conditions = [] ) : self
$table
Nama tabel$conditions
Pasangan kunci/nilai dari nama kolom dan nilai yang akan dibandingkanPeringatan: Nilai kondisi di-escape tetapi nama tabel dan nama kolom kondisi tidak! Hanya gunakan string tetap untuk nama tabel dan nama kolom kondisi tetapi tidak ada input eksternal!
Contoh:
$ db -> delete ( ' test ' , [ ' status ' => false , ' type ' => ' old ' ] );
$ db -> delete ( ' test ' );
Beberapa kondisi yang dilewati pada parameter kedua digabungkan dengan "DAN". Jika Anda memerlukan pernyataan yang lebih kompleks, gunakan metode stmt()
sebagai gantinya.
Menghapus kolom yang diberi nama jika ada
public function dropColumn( string $ table , $ name ) : self
$table
Nama tabel tempat kolom berada$name
Nama kolom atau kolomContoh:
$ db -> dropColumn ( ' test ' , ' oldcol ' );
$ db -> dropColumn ( ' test ' , [ ' oldcol ' , ' oldcol2 ' ] );
Jika kolom atau salah satu kolomnya tidak ada, maka akan diabaikan secara diam-diam.
Menghilangkan batasan kunci asing yang diberikan berdasarkan namanya jika ada
public function dropForeign( string $ table , $ name ) : self
$table
Nama tabel tempat batasan kunci asing berada$name
Nama batasan atau batasan kunci asingContoh:
$ db -> dropForeign ( ' test ' , ' fk_old ' );
$ db -> dropForeign ( ' test ' , [ ' fk_old ' , ' fk_old2 ' ] );
Jika batasan kunci asing atau salah satu batasan tidak ada, maka batasan tersebut akan diabaikan secara diam-diam.
Menghapus indeks yang diberikan berdasarkan namanya jika ada
public function dropIndex( string $ table , $ name ) : self
$table
Nama tabel tempat indeks berada$name
Nama indeks atau indeksContoh:
$ db -> dropIndex ( ' test ' , ' idx_old ' );
$ db -> dropIndex ( ' test ' , [ ' idx_old ' , ' idx_old2 ' ] );
Jika indeks atau salah satu indeks tidak ada, maka akan diabaikan secara diam-diam.
Menghapus urutan yang diberikan berdasarkan namanya jika ada
public function dropSequence( $ name ) : self
$name
Nama urutan atau urutanContoh:
$ db -> dropSequence ( ' seq_old ' );
$ db -> dropSequence ( [ ' seq_old ' , ' seq_old2 ' ] );
Jika sequence atau salah satu sequence tidak ada, maka sequence tersebut akan diabaikan secara diam-diam.
Menghapus tabel yang diberi nama jika ada
public function dropTable( $ name ) : self
$name
Nama tabel atau beberapa tabelContoh:
$ db -> dropTable ( ' test ' );
$ db -> dropTable ( [ ' test ' , ' test2 ' ] );
Jika tabel atau salah satu tabelnya tidak ada maka akan diabaikan secara diam-diam.
Menghilangkan tampilan yang diberikan berdasarkan namanya jika ada
public function dropView( $ name ) : self
$name
Nama tampilan atau tampilanContoh:
$ db -> dropView ( ' test ' );
$ db -> dropView ( [ ' test ' , ' test2 ' ] );
Jika tampilan atau salah satu tampilan tidak ada, maka akan diabaikan secara diam-diam.
Menjalankan pernyataan SQL khusus
public function exec( string $ sql , array $ params = [], array $ types = [] ) : int
$sql
Pernyataan SQL khusus$params
Daftar parameter posisi atau daftar asosiatif placeholder dan parameter$types
Daftar tipe data DBAL untuk parameter placeholder posisional atau asosiatifPerubahan database tidak langsung diterapkan, jadi selalu panggil up() sebelum menjalankan pernyataan khusus untuk memastikan bahwa tabel yang ingin Anda gunakan telah dibuat sebelumnya!
Contoh:
$ sql = ' UPDATE product SET status=? WHERE status=? ' ;
$ num = $ this -> db ()-> exec ( $ sql , [ 1 , 0 ] );
Mengeksekusi pernyataan SQL khusus jika database bertipe tertentu
public function for( $ type , $ sql ) : self
$type
Tipe database dimana pernyataan harus dieksekusi$sql
Pernyataan atau pernyataan SQL khususJenis platform basis data yang tersedia adalah:
Perubahan database tidak langsung diterapkan, jadi selalu panggil up()
sebelum menjalankan pernyataan khusus untuk memastikan bahwa tabel yang ingin Anda gunakan telah dibuat sebelumnya!
Contoh:
$ db -> for ( ' mysql ' , ' CREATE INDEX idx_test_label ON test (label(16)) ' );
$ db -> for ( [ ' mysql ' , ' sqlite ' ], [
' DROP INDEX unq_test_status ' ,
' UPDATE test SET status = 0 WHERE status IS NULL ' ,
] );
Memeriksa apakah kolom atau kolom ada
public function hasColumn( string $ table , $ name ) : bool
$table
Nama tabel tempat kolom berada$name
Nama kolom atau kolomContoh:
$ db -> hasColumn ( ' test ' , ' testcol ' );
$ db -> hasColumn ( ' test ' , [ ' testcol ' , ' testcol2 ' ] );
Memeriksa apakah ada batasan kunci asing
public function hasForeign( string $ table , $ name ) : bool
$table
Nama tabel tempat batasan kunci asing berada$name
Nama batasan atau batasan kunci asingContoh:
$ db -> hasForeign ( ' test ' , ' fk_testcol ' );
$ db -> hasForeign ( ' test ' , [ ' fk_testcol ' , ' fk_testcol2 ' ] );
Memeriksa apakah indeks ada
public function hasIndex( string $ table , $ name ) : bool
$table
Nama tabel tempat indeks berada$name
Nama indeks atau indeksContoh:
$ db -> hasIndex ( ' test ' , ' idx_test_col ' );
$ db -> hasIndex ( ' test ' , [ ' idx_test_col ' , ' idx_test_col2 ' ] );
Memeriksa apakah urutannya ada
public function hasSequence( $ name ) : bool
$name
Nama urutan atau urutanContoh:
$ db -> hasSequence ( ' seq_test ' );
$ db -> hasSequence ( [ ' seq_test ' , ' seq_test2 ' ] );
Memeriksa apakah tabel ada
public function hasTable( $ name ) : bool
$name
Nama tabel atau beberapa tabelContoh:
$ db -> hasTable ( ' test ' );
$ db -> hasTable ( [ ' test ' , ' test2 ' ] );
Memeriksa apakah tampilan ada
public function hasView( $ name ) : bool
$name
Nama tampilan atau tampilanContoh:
$ db -> hasView ( ' test ' );
$ db -> hasView ( [ ' test ' , ' test2 ' ] );
Menyisipkan catatan ke dalam tabel yang diberikan
public function insert( string $ table , array $ data ) : self
$table
Nama tabel$data
Pasangan kunci/nilai dari nama kolom/nilai yang akan disisipkanContoh:
$ db -> insert ( ' test ' , [ ' label ' => ' myvalue ' , ' status ' => true ] );
Mengembalikan ID baris terakhir yang disisipkan ke dalam tabel database mana pun
public function lastId() : string
Perhatian: Ini tidak berfungsi untuk platform Oracle karena Doctrine DBAL tidak mendukung kolom Oracle IDENTITY saat ini.
Contoh:
$ db -> lastId ();
Mengembalikan nama database
public function name() : string
Contoh:
$ db -> name ();
Mengutip suatu nilai
public function q( $ value , $ type = Doctrine DBAL ParameterType:: STRING ) : string
$value
Nilai untuk digunakan dalam kueri SQL yang tidak disiapkan$type
tipe parameter DBALContoh:
$ result = $ db -> stmt ()-> select ( ' * ' )-> from ( ' products ' )
-> where ( ' status = ' . $ db -> q ( $ _GET [ ' status ' ] ) )-> executeQuery ();
Mengutip pengidentifikasi database
public function qi( string $ identifier ) : string
$identifier
Pengidentifikasi seperti nama tabel atau kolomContoh:
$ result = $ db -> stmt ()-> select ( $ db -> qi ( ' key ' ) )-> from ( ' products ' )-> executeQuery ();
Menjalankan kueri SQL khusus
public function query( string $ sql , array $ params = [], array $ types = [] ) : Doctrine DBAL Result
$sql
Pernyataan SQL khusus$params
Daftar parameter posisi atau daftar asosiatif placeholder dan parameter$types
Daftar tipe data DBAL untuk parameter placeholder posisional atau asosiatifContoh:
$ result = $ db -> query ( ' SELECT id, label, status FROM product WHERE label LIKE ? ' , [ ' test% ' ] );
foreach ( $ result -> iterateAssociative () as $ row ) {
// ...
}
Tip: Periksa metode DBAL untuk mengambil data untuk informasi lebih lanjut.
Mengganti nama kolom atau daftar kolom
public function renameColumn( string $ table , $ from , string $ to = null ) : self
$table
Nama tabel$from
Nama kolom atau array nama kolom lama/baru$to
Nama kolom baru diabaikan jika parameter pertama adalah array Jika kolomnya belum ada, maka metode akan berhasil tetapi tidak terjadi apa-apa. Tidak diperlukan panggilan ke up()
.
Keterbatasan
Contoh:
// single column
$ db -> renameColumn ( ' testtable ' , ' test_col ' , ' test_column ' );
// rename several columns at once
$ db -> renameColumn ( ' testtable ' , [ ' tcol ' => ' testcol ' , ' tcol2 ' => ' testcol2 ' ] );
Mengganti nama kolom atau daftar kolom
public function renameIndex( string $ table , $ from , string $ to = null ) : self
$table
Nama tabel$from
Nama indeks atau larik nama indeks lama/baru$to
Nama indeks baru diabaikan jika parameter pertama adalah array Jika indeks belum ada maka metode akan berhasil tetapi tidak terjadi apa-apa. Tidak diperlukan panggilan ke up()
.
Contoh:
// single index
$ db -> renameIndex ( ' testtable ' , ' idxcol ' , ' idx_column ' );
// rename several indexes at once
$ db -> renameIndex ( ' testtable ' , [ ' idxcol ' => ' idx_column ' , ' idxcol2 ' => ' idx_column2 ' ] );
Mengganti nama tabel atau daftar tabel
public function renameTable( $ from , string $ to = null ) : self
$from
Nama tabel atau array nama tabel lama/baru$to
Nama tabel baru diabaikan jika parameter pertama adalah array Jika tabel belum ada, maka metode akan berhasil tetapi tidak terjadi apa-apa. Tidak diperlukan panggilan ke up()
.
Contoh:
// single table
$ db -> renameTable ( ' testtable ' , ' newtable ' );
// rename several tables at once
$ db -> renameTable ( [ ' testtable ' => ' newtable ' , ' oldtable ' => ' testtable2 ' ] );
Memuat ulang skema Doktrin aktual untuk database saat ini
public function reset() : self
Contoh:
$ db -> reset ();
Mengembalikan catatan dari tabel yang diberikan
public function select( string $ table , array $ conditions = null ) : array
$table
Nama tabel$conditions
Pasangan kunci/nilai dari nama kolom dan nilai yang akan dibandingkanContoh:
$ db -> select ( ' test ' , [ ' status ' => false , ' type ' => ' old ' ] );
$ db -> select ( ' test ' );
Beberapa kondisi yang dilewati pada parameter kedua digabungkan dengan "DAN". Jika Anda memerlukan pernyataan yang lebih kompleks, gunakan metode stmt()
sebagai gantinya.
Mengembalikan objek urutan untuk nama yang diberikan
public function sequence( string $ name , Closure $ fcn = null ) : Sequence
$name
Nama urutan$fcn
Fungsi anonim dengan parameter ($sequence) membuat atau memperbarui definisi urutan Jika urutannya belum ada, maka akan dibuat. Untuk mempertahankan perubahan dalam database, Anda harus memanggil up()
.
Contoh:
$ sequence = $ db -> sequence ( ' seq_test ' );
$ sequence = $ db -> sequence ( ' seq_test ' , function ( $ seq ) {
$ seq -> start ( 1000 )-> step ( 2 )-> cache ( 100 );
} )-> up ();
Mengembalikan pembuat kueri untuk pernyataan SQL baru
public function stmt() : Doctrine DBAL Query QueryBuilder
Contoh:
$ db -> stmt ()-> delete ( $ db -> qi ( ' test ' ) )
-> where ( $ db -> qi ( ' stat ' ) . ' = ? ' )-> setParameter ( 0 , false )
-> executeStatement ();
$ db -> stmt ()-> update ( $ db -> qi ( ' test ' ) )
-> where ( $ db -> qi ( ' stat ' ) . '' , ' ? ' )-> setParameter ( 0 , true )
-> executeStatement ();
$ result = $ db -> stmt ()-> select ( $ db -> qi ( ' id ' ), $ db -> qi ( ' code ' ) )
-> from ( $ db -> qi ( ' test ' ) )
-> where ( $ db -> qi ( ' stat ' ) . ' = 1 ' )
-> executeQuery ();
while ( $ row = $ result -> fetchAssociative () ) {
$ id = $ row [ ' id ' ];
}
**Perhatian: ** Anda harus mengutip sendiri semua nama tabel dan kolom menggunakan metode $db->qi()
!
Untuk detail selengkapnya tentang metode Doctrine QueryBuilder yang tersedia, silakan lihat dokumentasi Doktrin.
Mengembalikan objek tabel untuk nama yang diberikan
public function table( string $ name , Closure $ fcn = null ) : Table
$name
Nama tabel$fcn
Fungsi anonim dengan parameter ($table) membuat atau memperbarui definisi tabel Jika tabel belum ada maka akan dibuat. Untuk mempertahankan perubahan dalam database, Anda harus memanggil up()
.
Contoh:
$ table = $ db -> table ( ' test ' );
$ table = $ db -> table ( ' test ' , function ( $ t ) {
$ t -> id ();
$ t -> string ( ' label ' );
$ t -> bool ( ' status ' );
} )-> up ();
Mengeksekusi penutupan yang diberikan dalam suatu transaksi
public function transaction( Closure $ fcn ) : self
Contoh:
$ this -> db ()-> transaction ( function ( $ db ) {
// $db- > insert ( ... )
// $db- > update ( ... )
// $db- > delete ( ... )
} );
Mengembalikan objek sebagai array dari database
public function toArray() : array
Contoh:
$ this -> db ()-> toArray ();
Struktur array yang dikembalikan adalah:
[
' sequence ' => [
' testseq ' => [
' name ' => ' testseq ' ,
' cache ' => null ,
' start ' => 1000 ,
' step ' => 1
]
],
' table ' => [
' testtable ' => [
' name ' => ' testtable ' ,
' opt ' => [
' engine ' => ' InnoDB ' ,
' collation ' => ' utf8mb4_unicode_ci ' ,
' charset ' => ' utf8mb4 ' ,
' autoincrement ' => 1 ,
' comment ' => ''
],
' col ' => [
' id ' => [
' name ' => ' id ' ,
' type ' => ' integer ' ,
' length ' => null ,
' precision ' => null ,
' scale ' => 0 ,
' null ' => false ,
' seq ' => 1
' default ' => null,
' fixed ' => false ,
' unsigned ' => false ,
' comment ' => '' ,
' opt ' => []
],
' parentid ' => [
' name ' => ' parentid ' ,
' type ' => ' bigint ' ,
' length ' => null ,
' precision ' => null ,
' scale ' => 0 ,
' null ' => false ,
' seq ' => false ,
' default ' => null ,
' fixed ' => false ,
' unsigned ' => false ,
' comment ' => '' ,
' opt ' => []
],
' label ' => [
' name ' => ' label ' ,
' type ' => ' string ' ,
' length ' => 255 ,
' precision ' => null ,
' scale ' => 0 ,
' null ' => false ,
' seq ' => false ,
' default ' => null ,
' fixed ' => false ,
' unsigned ' => false ,
' comment ' => '' ,
' opt ' => [
' charset ' => ' utf8mb4 ' ,
' collation ' => ' utf8mb4_unicode_ci '
]
]
],
' index ' => [
' PRIMARY ' => [
' columns ' => [
0 => ' id '
],
' name ' => ' PRIMARY ' ,
' flags ' => [],
' options ' => [
' lengths ' => [
0 => null
]
],
' unique ' => 1 ,
' primary ' => 1
],
],
' foreign ' => [
' FK_6C73FFCA343B91AE ' => [
' localcol ' => [
0 => ' parentid '
],
' fktable ' => ' test ' ,
' fkcol ' => [
0 => ' id '
],
' name ' => ' FK_6C73FFCA343B91AE ' ,
' onDelete ' => ' CASCADE ' ,
' onUpdate ' => ' CASCADE '
]
]
]
],
' view ' => [
' testview ' => [
' name ' => ' testview ' ,
' sql ' => ' select `testtable`.`id` AS `id`,`testtable`.`label` AS `label` from `testtable` '
]
]
]
Mengembalikan tipe database
public function type() : string
Nilai yang mungkin adalah:
Contoh:
$ type = $ db -> type ();
Menerapkan perubahan pada skema database
public function up() : self
Contoh:
$ db -> up ();
Memperbarui catatan dari tabel yang diberikan
public function update( string $ table , array $ data , array $ conditions = [] ) : self
$table
Nama tabel$data
Pasangan kunci/nilai kolom nama/nilai yang akan diperbarui$conditions
Pasangan kunci/nilai dari nama kolom dan nilai untuk dibandingkanContoh:
$ db -> update ( ' test ' , [ ' status ' => true ] );
$ db -> update ( ' test ' , [ ' status ' => true ], [ ' status ' => false , ' type ' => ' new ' ] );
Beberapa kondisi yang dilewati pada parameter kedua digabungkan dengan "DAN". Jika Anda memerlukan pernyataan yang lebih kompleks, gunakan metode stmt()
sebagai gantinya.
Membuat tampilan dengan nama yang diberikan jika belum ada
public function view( string $ name , string $ sql , $ for = null ) : self
$name
Nama tampilan$sql
pernyataan SELECT untuk mengisi tampilan$for
tipe database SQL ini harus digunakan ("mysql", "mariadb", "postgresql", "sqlite", "sqlserver", "oracle", "db2")Jika tampilan belum ada, maka akan dibuat. Jika tidak, tidak akan terjadi apa-apa.
Contoh:
$ db -> view ( ' testview ' , ' SELECT * FROM testtable ' );
$ db -> view ( ' testview ' , ' SELECT id, label, status FROM testtable WHERE status = 1 ' );
$ db -> view ( ' testview ' , ' SELECT * FROM `testtable` WHERE `status` = 1 ' , ' mysql ' );
Objek skema tabel yang Anda dapatkan dengan memanggil table()
dalam tugas migrasi memberi Anda akses penuh ke tabel dan Anda dapat menambah, mengubah atau menghapus kolom, indeks, dan kunci asing, misalnya:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> id ();
$ table -> string ( ' label ' );
$ table -> col ( ' status ' , ' tinyint ' )-> default ( 0 );
} );
Selain metode col()
yang dapat menambahkan kolom dengan tipe sembarang, ada beberapa metode pintasan untuk tipe yang tersedia di semua implementasi server database:
Jenis kolom | Keterangan |
---|---|
bigid | Kolom BIGINT dengan urutan/peningkatan otomatis dan kunci utama yang ditetapkan |
orang besar | Kolom BIGINT dengan rentang dari −9223372036854775808 hingga 9223372036854775807 |
biner | Kolom VARBINARY hingga 255 byte |
gumpal | Kolom BLOB hingga 2GB |
bodoh | Kolom BOOLEAN/BIT/NUMBER, alias untuk "boolean" |
boolean | Kolom BOOLEAN/BIT/NUMBER untuk jawaban TRUE/FALSE. nilai 0/1 |
arang | Kolom CHAR dengan jumlah karakter tetap |
tanggal | Kolom DATE dalam format tanggal ISO ("YYYY-MM-DD) tanpa waktu dan zona waktu |
tanggalwaktu | Kolom DATETIME dalam format tanggal/waktu ISO ("YYYY-MM-DD HH:mm:ss") |
tabeldatetimetz | Kolom DATETIMETZ dalam format tanggal/waktu ISO tetapi dengan format zona waktu yang bervariasi |
desimal | Kolom DECIMAL untuk data numerik dengan presisi titik tetap (string dalam PHP) |
mengambang | Kolom FLOAT untuk data numerik dengan presisi floating-point 8 byte |
panduan | Pengidentifikasi unik global dengan 36 byte |
pengenal | Kolom INTEGER dengan urutan/peningkatan otomatis dan kunci utama yang ditetapkan |
ke dalam | Kolom INTEGER, alias untuk "integer" |
bilangan bulat | Kolom INTEGER dengan rentang dari −2147483648 hingga 2147483647 |
json | Kolom JSON untuk data JSON yang dikodekan UTF-8 |
kecil | Kolom INTEGER dengan rentang dari −32768 hingga 32767 |
rangkaian | Kolom VARCHAR dengan maksimal 255 karakter |
teks | Kolom TEXT/CLOB dengan karakter hingga 2GB |
waktu | Kolom WAKTU dalam 24 jam "HH:MM" dari jam, misalnya "05:30" atau "22:15" |
uuid | Pengidentifikasi unik global dengan 36 byte, alias untuk "guid" |
MySQL (atau MariaDB, dll.) mendukung beberapa opsi untuk menentukan aspek tabel. Opsi mesin akan menentukan mesin penyimpanan yang digunakan untuk tabel:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> opt ( ' engine ' , ' InnoDB ' );
} );
Sebagai jalan pintas, Anda juga dapat menyetel opsi sebagai properti:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> engine = ' InnoDB ' ;
} );
Untuk membuat tabel sementara , gunakan:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> temporary = true ;
} );
Anda juga dapat menyetel rangkaian karakter dan susunan default untuk kolom string dan teks:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> charset = ' utf8mb4 ' ;
$ table -> collation = ' utf8mb4_unicode_ci ' ;
} );
Catatan: Kolasi juga didukung oleh PostgreSQL dan SQL Server tetapi nilainya berbeda. Oleh karena itu, tidak mungkin menggunakan nilai yang sama untuk semua jenis server. Untuk menghindari masalah itu, gunakan metode kolom opt()
dan teruskan tipe server database sebagai parameter ketiga:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> opt ( ' charset ' , ' utf8mb4 ' , ' mysql ' );
$ table -> opt ( ' collation ' , ' utf8mb4_unicode_ci ' , ' mysql ' );
} );
Sekarang, rangkaian karakter dan susunan default hanya akan disetel untuk server database MySQL (atau MariaDB dan fork serupa).
Jika Anda perlu mengetahui nilai opsi tabel saat ini:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
// return the used table engine ( only MySQL , MariaDB , etc . )
$ engine = $ table -> engine ;
// returns TRUE if it ' s a temporary table
$ isTemp = $ table -> temporary ;
// return the current charset
$ charset = $ table -> charset ;
// return the current collation
$ collation = $ table -> collation ;
} );
Untuk memeriksa apakah tabel sudah ada, gunakan metode hasTable()
:
if ( $ this -> db ()-> hasTable ( ' users ' ) ) {
// The "users" table exists
}
Anda juga dapat memeriksa beberapa tabel sekaligus:
if ( $ this -> db ()-> hasTable ( [ ' users ' , ' addresses ' ] ) ) {
// The "users" and "addresses" tables exist
}
Metode hasTable()
hanya akan mengembalikan TRUE jika semua tabel ada.
Selain membuat dan mengakses tabel, metode table()
dari objek skema juga dapat digunakan untuk memperbarui skema tabel. Ia menerima nama tabel dan penutupan yang akan menerima objek skema tabel.
Mari kita buat tabel bernama test terlebih dahulu termasuk tiga kolom:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> id ();
$ table -> string ( ' label ' );
$ table -> col ( ' status ' , ' tinyint ' )-> default ( 0 );
} );
Sekarang, kami ingin memperbarui tabel dalam migrasi lain dengan menambahkan kolom kode dan mengubah nilai default kolom status yang ada:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' );
$ table -> col ( ' status ' , ' tinyint ' )-> default ( 1 );
} );
Perubahan akan tetap ada di database segera setelah metode table()
kembali sehingga tidak perlu memanggil up()
sendiri setelahnya. Untuk jenis dan opsi kolom yang tersedia, lihat bagian kolom.
Objek database yang dikembalikan oleh $this->db()
dapat mengganti nama tabel saat menggunakan metode renameTable()
:
// Renames the table "users" to "accounts"
$ this -> db ()-> renameTable ( ' users ' , ' account ' );
Dimungkinkan juga untuk mengganti nama beberapa tabel sekaligus jika Anda meneruskan array asosiatif dengan nama lama dan baru sebagai pasangan kunci/nilai:
// Renames the table "users" to "accounts" and "blog" to "posts"
$ this -> db ()-> renameTable ( [ ' users ' => ' account ' , ' blog ' => ' posts ' ] );
Tabel hanya diganti namanya jika ada. Jika tabel tidak ada lagi, tidak ada kesalahan yang dilaporkan:
$ this -> db ()-> renameTable ( ' notexist ' , ' newtable ' );
Dalam hal ini, pemanggilan metode akan berhasil tetapi tidak terjadi apa-apa.
Untuk menghapus tabel, Anda harus menggunakan metode dropTable()
dari skema database:
$ this -> db ()-> dropTable ( ' users ' );
Anda juga dapat menghapus beberapa tabel sekaligus dengan meneruskan daftar sebagai array:
$ this -> db ()-> dropTable ( [ ' users ' , ' addresses ' ] );
Tabel hanya dihapus jika ada. Jika tabel tidak ada lagi, tidak ada kesalahan yang dilaporkan:
$ this -> db ()-> dropTable ( ' notexist ' );
Dalam hal ini, pemanggilan metode akan berhasil tetapi tidak terjadi apa-apa.
Memanggil metode khusus atau meneruskan panggilan metode yang tidak diketahui ke objek tabel Ajaran
public function __call( string $ method , array $ args )
$method
Nama metode$args
Parameter metodeContoh:
Anda dapat mendaftarkan metode khusus yang memiliki akses ke properti kelas objek Tabel Upscheme:
Aimeos Upscheme Schema Table:: macro ( ' addConstraint ' , function ( array $ columns ) {
return $ this -> to -> addUniqueConstraint ( $ columns );
} );
$ table -> addConstraint ( [ ' col1 ' , ' col2 ' ] );
Properti kelas yang tersedia adalah:
$this->table
: Skema tabel doktrin
$this->up
: Objek skema tambahan
Selanjutnya, Anda dapat memanggil metode tabel Doktrin apa pun secara langsung, misalnya:
$ table -> addUniqueConstraint ( [ ' col1 ' , ' col2 ' ] );
Mengembalikan nilai untuk opsi tabel yang diberikan
public function __get( string $ name )
$name
Nama opsi tabelDaftar opsi tabel yang tersedia adalah:
Contoh:
$ engine = $ table -> engine ;
// same as
$ engine = $ table -> opt ( ' engine ' );
Menetapkan nilai baru untuk opsi tabel yang diberikan
public function __set( string $ name , $ value )
$name
Nama opsi tabelDaftar opsi tabel yang tersedia adalah:
Contoh:
$ table -> engine = ' InnoDB ' ;
// same as
$ table -> opt ( ' engine ' , ' InnoDB ' );
Membuat kolom ID baru dengan tipe "bigint" atau mengembalikan kolom yang sudah ada
public function bigid( string $ name = null ) : Column
$name
Nama kolom IDKolom mendapat urutan (peningkatan otomatis) dan kunci utama ditetapkan secara otomatis. Jika kolomnya belum ada, maka akan dibuat.
Contoh:
$ table -> bigid ();
$ table -> bigid ( ' uid ' );
Membuat kolom baru dengan tipe "bigint" atau mengembalikan kolom yang sudah ada
public function bigint( string $ name ) : Column
$name
Nama kolomJika kolomnya belum ada, maka akan dibuat.
Contoh:
$ table -> bigint ( ' testcol ' );
Membuat kolom baru bertipe "biner" atau mengembalikan kolom yang sudah ada
public function binary( string $ name , int $ length = 255 ) : Column
$name
Nama kolom$length
Panjang kolom dalam byteJika kolomnya belum ada, maka akan dibuat.
Contoh:
$ table -> binary ( ' testcol ' );
$ table -> binary ( ' testcol ' , 32 );
Membuat kolom baru dengan tipe "gumpalan" atau mengembalikan kolom yang sudah ada
public function blob( string $ name , int $ length = 0x7fff ) : Column
$name
Nama kolom$length
Panjang kolom dalam bytePanjang maksimum kolom "gumpalan" adalah 2 GB. Jika kolomnya belum ada maka akan dibuat.
Contoh:
$ table -> blob ( ' testcol ' );
$ table -> blob ( ' testcol ' , 0x7fffffff );
Membuat kolom baru bertipe "boolean" atau mengembalikan kolom yang sudah ada
public function bool( string $ name ) : Column
$name
Nama kolomMetode ini adalah alias untuk boolean(). Jika kolomnya belum ada maka akan dibuat.
Contoh:
$ table -> bool ( ' testcol ' );
Membuat kolom baru bertipe "boolean" atau mengembalikan kolom yang sudah ada
public function boolean( string $ name ) : Column
$name
Nama kolomJika kolomnya belum ada maka akan dibuat.
Contoh:
$ table -> boolean ( ' testcol ' );
Membuat kolom baru bertipe "char" dengan tipe tetap atau mengembalikan kolom yang sudah ada
public function char( string $ name , int $ length ) : Column
$name
Nama kolom$length
Panjang kolom dalam karakterJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> char ( ' testcol ' , 3 );
Membuat kolom baru atau mengembalikan yang sudah ada
public function col( string $ name , string $ type = null ) : Column
$name
nama kolom$type
tipe kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> col ( ' testcol ' );
$ table -> col ( ' testcol ' , ' tinyint ' );
Membuat kolom baru tipe "tanggal" atau mengembalikan yang sudah ada
public function date( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> date ( ' testcol ' );
Membuat kolom baru tipe "datetime" atau mengembalikan yang sudah ada
public function datetime( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> datetime ( ' testcol ' );
Membuat kolom baru tipe "datetimetz" atau mengembalikan yang sudah ada
public function datetimetz( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> datetimetz ( ' testcol ' );
Membuat kolom baru tipe "desimal" atau mengembalikan yang sudah ada
public function decimal( string $ name , int $ digits , int $ decimals = 2 ) : Column
$name
nama kolom$digits
Jumlah total digit desimal termasuk desimal$decimals
jumlah digit setelah titik desimalJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> decimal ( ' testcol ' , 10 ); // 10 digits incl . 2 decimals
$ table -> decimal ( ' testcol ' , 10 , 4 ); // 10 digits incl . 4 decimals
Menjatuhkan kolom yang diberikan dengan namanya jika ada
public function dropColumn( $ name ) : self
$name
nama kolom atau kolom Jika kolom atau salah satu kolom tidak ada, itu akan diam -diam diabaikan. Perubahan tidak akan diterapkan sampai tugas migrasi selesai atau up()
dipanggil.
Contoh:
$ table -> dropColumn ( ' testcol ' );
$ table -> dropColumn ( [ ' testcol ' , ' testcol2 ' ] );
Menjatuhkan indeks yang diberikan dengan namanya jika ada
public function dropIndex( $ name ) : self
$name
nama nama indeks atau indeks Jika indeks atau salah satu indeks tidak ada, itu akan diam -diam diabaikan. Perubahan tidak akan diterapkan sampai tugas migrasi selesai atau up()
dipanggil.
Contoh:
$ table -> dropIndex ( ' idx_test_col ' );
$ table -> dropIndex ( [ ' idx_test_col ' , ' idx_test_col2 ' ] );
Menjatuhkan kendala kunci asing yang diberikan dengan namanya jika ada
public function dropForeign( $ name ) : self
$name
kendala atau kendala kunci asing Jika kendala kunci asing atau salah satu kendala tidak ada, itu akan diam -diam diabaikan. Perubahan tidak akan diterapkan sampai tugas migrasi selesai atau up()
dipanggil.
Contoh:
$ table -> dropForeign ( ' fk_test_col ' );
$ table -> dropForeign ( [ ' fk_test_col ' , ' fk_test_col2 ' ] );
Menjatuhkan kunci utama jika ada
public function dropPrimary() : self
Jika kunci utama tidak ada, itu akan diabaikan secara diam -diam. Perubahan tidak akan diterapkan sampai tugas migrasi selesai atau up()
dipanggil.
Contoh:
$ table -> dropPrimary ();
Membuat kolom baru tipe "float" atau mengembalikan yang sudah ada
public function float( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> float ( ' testcol ' );
Menciptakan kunci asing baru atau mengembalikan yang sudah ada
public function foreign( $ localcolumn , string $ foreigntable , $ foreigncolumn = ' id ' , string $ name = null ) : Foreign
$localcolumn
nama kolom atau kolom lokal$foreigntable
nama tabel yang direferensikan$foreigncolumn
Nama kolom atau kolom yang direferensikan$name
kendala kunci asing dan indeks kunci asing atau nol untuk nama autogenerasiPanjang nama kunci asing tidak boleh lebih dari 30 karakter untuk kompatibilitas maksimum.
Contoh:
$ table -> foreign ( ' parentid ' , ' test ' );
$ table -> foreign ( ' parentid ' , ' test ' , ' uid ' );
$ table -> foreign ( ' parentid ' , ' test ' , ' id ' , ' fk_test_pid ' );
$ table -> foreign ( [ ' parentid ' , ' siteid ' ], ' test ' , [ ' uid ' , ' siteid ' ] );
Membuat kolom baru tipe "Guid" atau mengembalikan yang sudah ada
public function guid( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> guid ( ' testcol ' );
Periksa apakah kolom itu ada
public function hasColumn( $ name ) : bool
$name
nama kolom atau kolomContoh:
$ table -> hasColumn ( ' testcol ' );
$ table -> hasColumn ( [ ' testcol ' , ' testcol2 ' ] );
Memeriksa apakah indeks ada
public function hasIndex( $ name ) : bool
$name
nama nama indeks atau indeksContoh:
$ table -> hasIndex ( ' idx_test_col ' );
$ table -> hasIndex ( [ ' idx_test_col ' , ' idx_test_col2 ' ] );
Periksa apakah ada kendala kunci asing
public function hasForeign( $ name ) : bool
$name
kendala atau kendala kunci asingContoh:
$ table -> hasForeign ( ' fk_test_col ' );
$ table -> hasForeign ( [ ' fk_test_col ' , ' fk_test_col2 ' ] );
Membuat kolom ID baru tipe "integer" atau mengembalikan yang sudah ada
public function id( string $ name = null ) : Column
$name
nama kolom IDKolom mendapatkan urutan (autoincrement) dan kunci utama yang ditetapkan secara otomatis. Jika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> id ();
$ table -> id ( ' uid ' );
Membuat indeks baru atau menggantikan yang sudah ada
public function index( $ columns , string $ name = null ) : self
$columns
nama kolom atau kolom memalsukan indeks$name
atau nol untuk nama autogeneratedPanjang nama indeks tidak boleh lebih dari 30 karakter untuk kompatibilitas maksimum.
Contoh:
$ table -> index ( ' testcol ' );
$ table -> index ( [ ' testcol ' , ' testcol2 ' ] );
$ table ->index( ' testcol ' , 'idx_test_testcol );
Membuat kolom baru tipe "integer" atau mengembalikan yang sudah ada
public function int( string $ name ) : Column
$name
nama kolomMetode ini adalah alias untuk integer (). Jika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> int ( ' testcol ' );
Membuat kolom baru tipe "integer" atau mengembalikan yang sudah ada
public function integer( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> integer ( ' testcol ' );
Membuat kolom baru tipe "json" atau mengembalikan yang sudah ada
public function json( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> json ( ' testcol ' );
Mengembalikan nama tabel
public function name() : string
Contoh:
$ tablename = $ table -> name ();
Menetapkan opsi skema khusus atau mengembalikan nilai saat ini
public function opt( string $ name , $ value = null )
$name
nama opsi skema khusus terkait tabel$value
nilai opsi skema khususOpsi skema khusus yang tersedia adalah:
Contoh:
$ charset = $ table -> opt ( ' charset ' );
$ table -> opt ( ' charset ' , ' utf8 ' )-> opt ( ' collation ' , ' utf8_bin ' );
// Magic methods :
$ charset = $ table -> charset ;
$ table -> charset = ' binary ' ;
Membuat indeks primer baru atau menggantikan yang sudah ada
public function primary( $ columns , string $ name = null ) : self
$columns
nama kolom atau kolom memalsukan indeks$name
atau nol untuk nama autogeneratedPanjang nama indeks tidak boleh lebih dari 30 karakter untuk kompatibilitas maksimum.
Contoh:
$ table -> primary ( ' testcol ' );
$ table -> primary ( [ ' testcol ' , ' testcol2 ' ] );
$ table -> primary ( ' testcol ' , ' pk_test_testcol ' );
Mengganti nama kolom atau daftar kolom
public function renameColumn( $ from , string $ to = null ) : self
$from
nama kolom atau array nama kolom lama/baru$to
nama kolom baru diabaikan jika parameter pertama adalah arrayContoh:
// single column
$ table -> renameColumn ( ' test_col ' , ' test_column ' );
// rename several columns at once
$ table -> renameColumn ( [ ' tcol ' => ' testcol ' , ' tcol2 ' => ' testcol2 ' ] );
Mengganti nama indeks atau daftar indeks
public function renameIndex( $ from , string $ to = null ) : self
$from
nama indeks atau array nama indeks lama/baru (jika nama indeks baru nol, itu akan dihasilkan)$to
indeks baru atau nol untuk nama autogenerated (diabaikan jika parameter pertama adalah array)Panjang nama indeks tidak boleh lebih dari 30 karakter untuk kompatibilitas maksimum.
Contoh:
// generate a new name automatically
$ table -> renameIndex ( ' test_col_index ' );
// custom name
$ table -> renameIndex ( ' test_col_index ' , ' idx_test_col ' );
// rename several indexes at once
$ table -> renameIndex ( [ ' test_col_index ' => null , ' test_index ' => ' idx_test_col ' ] );
Membuat kolom baru tipe "smallint" atau mengembalikan yang sudah ada
public function smallint( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> smallint ( ' testcol ' );
Membuat indeks spasial baru atau menggantikan yang sudah ada
public function spatial( $ columns , string $ name = null ) : self
$columns
Nama kolom atau kolom memalsukan indeks$name
atau nol untuk nama autogeneratedPanjang nama indeks tidak boleh lebih dari 30 karakter untuk kompatibilitas maksimum.
Contoh:
$ table -> spatial ( ' testcol ' );
$ table -> spatial ( [ ' testcol ' , ' testcol2 ' ] );
$ table -> spatial ( ' testcol ' , ' idx_test_testcol ' );
Membuat kolom baru tipe "string" atau mengembalikan yang sudah ada
public function string( string $ name , int $ length = 255 ) : Column
$name
nama kolom$length
panjang kolom dalam karakterJenis ini harus digunakan hingga 255 karakter. Untuk lebih banyak karakter, gunakan tipe "Teks". Jika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> string ( ' testcol ' );
$ table -> string ( ' testcol ' , 32 );
Membuat kolom baru tipe "teks" atau mengembalikan yang sudah ada
public function text( string $ name , int $ length = 0xffff ) : Column
$name
nama kolom$length
panjang kolom dalam karakterPanjang maksimum kolom "teks" adalah 2GB. Jika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> text ( ' testcol ' );
$ table -> text ( ' testcol ' , 0x7fffffff );
Membuat kolom baru tipe "waktu" atau mengembalikan yang sudah ada
public function time( string $ name ) : Column
$name
nama kolomJika kolom belum ada, itu akan dibuat. Tipe data ini tidak tersedia saat menggunakan database Oracle.
Contoh:
$ table -> time ( ' testcol ' );
Membuat indeks unik baru atau menggantikan yang sudah ada
public function unique( $ columns , string $ name = null ) : self
$columns
Nama kolom atau kolom memalsukan indeks$name
atau nol untuk nama autogeneratedPanjang nama indeks tidak boleh lebih dari 30 karakter untuk kompatibilitas maksimum.
Contoh:
$ table -> unique ( ' testcol ' );
$ table -> unique ( [ ' testcol ' , ' testcol2 ' ] );
$ table -> unique ( ' testcol ' , ' unq_test_testcol ' );
Membuat kolom baru tipe "Guid" atau mengembalikan yang sudah ada
public function uuid( string $ name ) : Column
$name
nama kolomMetode ini adalah alias untuk GUID (). Jika kolom belum ada, itu akan dibuat.
Contoh:
$ table -> uuid ( ' testcol ' );
Menerapkan perubahan pada skema database
public function up() : self
Contoh:
$ table -> up ();
Objek skema kolom yang Anda dapatkan dengan menelepon col()
dalam tugas migrasi Anda memberi Anda akses ke semua properti kolom. Ada juga pintasan yang tersedia untuk jenis kolom yang didukung oleh semua database. Setiap kolom dapat diubah dengan satu atau lebih metode pengubah dan Anda juga dapat menambahkan indeks ke kolom tunggal, misalnya:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> id ()-> unsigned ( true );
$ table -> string ( ' label ' )-> index ();
$ table -> col ( ' status ' , ' tinyint ' )-> default ( 0 );
} );
Contohnya akan menambahkan kolom berikut:
Ada beberapa metode pintasan untuk jenis kolom yang tersedia di semua implementasi server database:
Tipe kolom | Keterangan |
---|---|
Bigid | Kolom Bigint dengan urutan/autoincrement dan kunci utama yang ditetapkan |
Bigint | Kolom Bigint dengan kisaran dari −922337203685475808 hingga 9223372036854775807 |
biner | Kolom varbinary dengan hingga 255 byte |
gumpal | Kolom gumpalan dengan hingga 2GB |
bodoh | Boolean/bit/angka colum, alias untuk "boolean" |
boolean | Boolean/bit/angka colum untuk resp true/false. 0/1 nilai |
arang | Kolom char dengan jumlah karakter tetap |
tanggal | Kolom Tanggal dalam Format Tanggal ISO ("Yyyy-Mm-DD) tanpa waktu dan waktu waktu |
datetime | Kolom datetime dalam format tanggal/waktu ISO ("yyyy-mm-dd hh: mm: ss") |
TABLESDATETIMETZ | Kolom Datetimetz dalam format tanggal/waktu ISO tetapi dengan format zona waktu yang bervariasi |
desimal | Kolom desimal untuk data numerik dengan presisi titik tetap (string dalam php) |
mengambang | Kolom pelampung untuk data numerik dengan presisi titik mengambang 8-byte |
panduan | Pengidentifikasi unik secara global dengan 36 byte |
pengenal | Kolom integer dengan urutan/autoincrement dan kunci utama yang ditetapkan |
ke dalam | Integer Colum, alias untuk "Integer" |
bilangan bulat | Integer Colum dengan kisaran dari −2147483648 hingga 2147483647 |
json | Kolom JSON untuk data JSON yang dikodekan UTF-8 |
Smallint | Integer Colum dengan kisaran dari −32768 hingga 32767 |
rangkaian | Kolom varchar dengan hingga 255 karakter |
teks | Kolom teks/clob dengan karakter hingga 2GB |
waktu | Kolom waktu dalam 24 jam "hh: mm" fromat, misalnya "05:30" atau "22:15" |
uuid | Pengidentifikasi unik secara global dengan 36 byte, alias untuk "Guid" |
Untuk menambahkan tipe kolom spesifik database, gunakan metode col()
, misalnya:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> col ( ' status ' , ' tinyint ' );
} );
Dimungkinkan juga untuk mengubah definisi kolom dengan memanggil satu atau lebih metode pengubah kolom:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> int ( ' number ' )-> null ( true )-> unsigned ( true );
} );
Metode pengubah kolom yang tersedia adalah:
Pengubah kolom | Keterangan |
---|---|
Autoincrement (true) | Atur kolom integer sebagai penambah otomatis (alias untuk seq() ) |
Charset ('UTF8') | Set karakter yang digunakan oleh kolom (mysql) |
Collation ('Binary') | Kolasi kolom (mysql/postgresql/sqlite/sqlserver tetapi tidak kompatibel) |
Komentar ('Komentar') | Tambahkan komentar ke kolom (MySQL/POSTGRESQL/ORACLE/SQLSERVER) |
default (1) | Nilai default kolom jika tidak ada nilai yang ditentukan (default: NULL ) |
diperbaiki (benar) | Jika kolom string atau biner harus memiliki panjang tetap |
index ('idx_col') | Tambahkan indeks ke kolom, nama indeks adalah opsional |
panjang (32) | Max. panjang kolom string dan biner |
null (true) | Izinkan nilai nol dimasukkan ke dalam kolom |
Presisi (12) | Max. Jumlah digit yang disimpan dalam kolom desimal dan float termasuk. digit desimal |
primer ('pk_col') | Tambahkan kunci utama ke kolom, nama kunci utama adalah opsional |
skala (2) | Jumlah pasti digit desimal yang digunakan dalam kolom desimal dan float |
seq (true) | Atur kolom integer sebagai penambah otomatis jika tidak ada nilai yang ditentukan |
spatial ('idx_col') | Tambahkan indeks spasial (GEO) ke kolom, nama indeks adalah opsional |
unik ('unq_col') | Tambahkan indeks unik ke kolom, nama indeks adalah opsional |
tidak ditandatangani (benar) | Izinkan Nilai Integer yang Tidak Ditandatangani Hanya (MySQL) |
Untuk mengatur opsi skema khusus untuk kolom, gunakan metode opt()
, misalnya:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' )-> opt ( ' collation ' , ' utf8mb4 ' );
} );
Bahkan mungkin untuk mengatur pengubah kolom untuk implementasi database tertentu dengan meneruskan jenis database sebagai parameter ketiga:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' )-> opt ( ' collation ' , ' utf8mb4 ' , ' mysql ' );
} );
Untuk memeriksa apakah kolom sudah ada, gunakan metode hasColumn()
:
if ( $ this -> db ()-> hasColumn ( ' users ' , ' name ' ) ) {
// The "name" column in the "users" table exists
}
Anda dapat memeriksa beberapa kolom sekaligus. Dalam hal ini, metode hasColumn()
hanya akan mengembalikan true jika semua kolom ada:
if ( $ this -> db ()-> hasColumn ( ' users ' , [ ' name ' , ' status ' ] ) ) {
// The "name" and "status" columns in the "users" table exists
}
Jika Anda sudah memiliki objek tabel, Anda dapat menggunakan hasColumn()
juga:
if ( $ table -> hasColumn ( ' name ' ) ) {
// The "name" column in the table exists
}
if ( $ table -> hasColumn ( [ ' name ' , ' status ' ] ) ) {
// The "name" and "status" columns in the table exists
}
Selain kolom, Anda juga dapat memeriksa apakah pengubah kolom diatur dan nilai mana yang mereka miliki:
if ( $ table -> string ( ' code ' )-> null () ) {
// The "code" columns is nullable
}
Mengambil nilai pengubah kolom saat ini dimungkinkan menggunakan metode ini:
Pengubah kolom | Keterangan |
---|---|
Autoincrement () | Benar jika kolom tersebut meningkat secara otomatis (alias untuk seq() ) |
charset () | Set karakter yang digunakan (mysql) |
pemeriksaan() | Kolasi yang Digunakan (MySQL/PostgreSQL/SQLite/SQLServer tetapi tidak kompatibel) |
komentar() | Komentar Terkait dengan Kolom (MySQL/PostgreSQL/Oracle/SQLServer) |
bawaan() | Nilai default kolom |
tetap() | Benar jika string atau kolom biner memiliki panjang tetap |
panjang() | Panjang maksimum string atau kolom biner |
batal() | Benar jika nilai nol diperbolehkan |
presisi () | Jumlah maksimum digit yang disimpan dalam kolom desimal dan float termasuk. digit desimal |
skala() | Jumlah pasti digit desimal yang digunakan dalam kolom desimal dan float |
seq () | Benar jika kolom tersebut meningkat secara otomatis |
tidak ditandatangani () | Benar jika hanya nilai integer yang tidak ditandatangani diizinkan (mysql) |
Untuk memeriksa pengubah kolom non-standar, gunakan metode opt()
tanpa parameter kedua. Kemudian, itu akan mengembalikan nilai saat ini dari pengubah kolom:
if ( $ table -> string ( ' code ' )-> opt ( ' charset ' ) === ' utf8 ' ) {
// The "code" columns uses UTF - 8 charset ( MySQL only)
}
Dimungkinkan untuk mengubah sebagian besar pengubah kolom seperti panjang kolom string:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' )-> length ( 64 );
} );
Beberapa metode juga menawarkan parameter tambahan untuk mengatur pengubah yang paling sering digunakan secara langsung:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' , 64 );
} );
Jika Anda perlu mengubah pengubah kolom segera karena Anda ingin memigrasikan baris sesudahnya, gunakan metode up()
untuk mempertahankan perubahan:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' , 64 )-> null ( true )-> up ();
// modify rows from "test" table
} );
Mengubah jenis kolom dimungkinkan dengan menggunakan metode baru untuk jenis yang sesuai atau metode col()
:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> text ( ' code ' );
// or
$ table -> col ( ' code ' , ' text ' );
} );
Ketahuilah bahwa tidak semua jenis kolom dapat diubah menjadi tipe lain atau setidaknya bukan tanpa kehilangan data. Anda dapat mengubah kolom integer ke kolom BigInt tanpa masalah tetapi sebaliknya putaran akan gagal. Hal yang sama terjadi jika Anda ingin mengubah kolom varchar (string) menjadi kolom integer.
Untuk mengganti nama kolom, gunakan metode renameColumn()
dari skema DB:
// single column
$ this -> db ()-> renameColumn ( ' testtable ' , ' label ' , ' name ' );
// multiple columns
$ this -> db ()-> renameColumn ( ' testtable ' , [ ' label ' => ' name ' , ' stat ' => ' status ' ] );
Jika objek tabel sudah tersedia, Anda dapat menggunakan metode renameColumn()
untuk mengganti nama satu atau lebih kolom:
$ this -> db ()-> table ( ' testtable ' , function ( $ table ) {
// single column
$ table -> renameColumn ( ' label ' , ' name ' );
// multiple columns
$ table -> renameColumn ( [ ' label ' => ' name ' , ' stat ' => ' status ' ] );
} );
Dalam semua kasus, kolom hanya dihapus jika ada. Tidak ada kesalahan yang dilaporkan jika satu atau lebih kolom tidak ada dalam tabel.
Untuk menjatuhkan kolom, gunakan metode dropColumn()
dari objek skema DB:
$ this -> db ()-> dropColumn ( ' users ' , ' name ' );
Anda dapat menjatuhkan beberapa kolom sekaligus jika Anda memberikan nama semua kolom yang ingin Anda turunkan sebagai array:
$ this -> db ()-> dropColumn ( ' users ' , [ ' name ' , ' status ' ] );
Jika Anda sudah memiliki objek tabel, Anda dapat menggunakan dropColumn()
juga:
// single column
$ table -> dropColumn ( ' name ' );
// multiple columns
$ table -> dropColumn ( [ ' name ' , ' status ' ] );
Dalam semua kasus, kolom hanya dihapus jika ada. Tidak ada kesalahan yang dilaporkan jika satu atau lebih kolom tidak ada dalam tabel.
Panggilan Metode Kustom atau Melewati Panggilan Metode Tidak Diketahui ke Objek Kolom Doktrin
public function __call( string $ method , array $ args )
$method
nama metode ini$args
Metode parameterContoh:
Anda dapat mendaftarkan metode khusus yang memiliki akses ke properti kelas dari objek kolom Upscheme:
Aimeos Upscheme Schema Column:: macro ( ' platform ' , function ( array $ options ) {
return $ this -> to -> setPlatformOptions ( $ options );
} );
$ column -> platform ( [ ' option ' => ' value ' ] );
Properti kelas yang tersedia adalah:
$this->db
: objek db upscheme
$this->table
: skema tabel doktrin
$this->column
: skema kolom doktrin
Selanjutnya, Anda dapat menghubungi metode kolom doktrin apa pun secara langsung, misalnya:
$ column -> setPlatformOptions ( [ ' option ' => ' value ' ] );
Mengembalikan nilai untuk opsi kolom yang diberikan
public function __get( string $ name )
$name
kolom nama opsi namaDaftar opsi kolom yang tersedia adalah:
Contoh:
$ charset = $ column -> charset ;
// same as
$ charset = $ column -> opt ( ' charset ' );
Menetapkan nilai baru untuk opsi kolom yang diberikan
public function __set( string $ name , $ value )
$name
kolom nama opsi nama$value
kolom nilai opsiDaftar opsi kolom yang tersedia adalah:
Contoh:
$ column -> charset = ' utf8 ' ;
// same as
$ column -> opt ( ' charset ' , ' utf8 ' );
Menetapkan kolom sebagai autoINCREMENT atau mengembalikan nilai saat ini
public function autoincrement( bool $ value = null )
$value
bendera autoINCREMENT baru atau nol untuk mengembalikan nilai saat ini Metode ini adalah alias untuk metode seq()
.
Contoh:
$ value = $ column -> autoincrement ();
$ column -> autoincrement ( true );
Mengatur charset kolom atau mengembalikan nilai saat ini
public function charset( string $ value = null )
$value
charset kolom baru atau nol untuk mengembalikan nilai saat iniContoh:
$ comment = $ column -> charset ();
$ column -> charset ( ' utf8 ' );
Menetapkan kolom kolom atau mengembalikan nilai saat ini
public function collation( string $ value = null )
$value
nilai kolom kolom baru atau nol untuk mengembalikan nilai saat iniContoh:
$ comment = $ column -> collation ();
$ column -> collation ( ' binary ' );
Menetapkan komentar kolom atau mengembalikan nilai saat ini
public function comment( string $ value = null )
$value
komentar kolom baru atau nol untuk mengembalikan nilai saat iniContoh:
$ comment = $ column -> comment ();
$ column -> comment ( ' column comment ' );
Menetapkan nilai default kolom atau mengembalikan nilai saat ini
public function default( $ value = null )
$value
kolom baru nilai default atau nol untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> default ();
$ column -> default ( 0 );
Menetapkan bendera tetap kolom atau mengembalikan nilai saat ini
public function fixed( bool $ value = null )
$value
kolom baru bendera tetap atau nol untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> fixed ();
$ column -> fixed ( true );
Membuat indeks reguler untuk kolom
public function index( string $ name = null ) : self
$name
indeks atau nol untuk menghasilkan secara otomatisContoh:
$ column -> index ();
$ column -> index ( ' idx_col ' );
Mengatur panjang kolom atau mengembalikan nilai saat ini
public function length( int $ value = null )
$value
kolom baru panjang atau nol untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> length ();
$ column -> length ( 32 );
Mengembalikan nama kolom
public function name() : string
Contoh:
$ name = $ column -> name ();
Menetapkan bendera nol kolom atau mengembalikan nilai saat ini
public function null( bool $ value = null )
$value
kolom baru null flag atau null untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> null ();
$ column -> null ( true );
Menetapkan nilai opsi kolom atau mengembalikan nilai saat ini
public function opt( string $ option , $ value = null , $ for = null )
$option
Opsi Nama Opsi$value
nilai opsi kolom baru atau nol untuk mengembalikan nilai saat ini$for
tipe basis data opsi ini harus digunakan untuk ("mysql", "mariadb", "postgresql", "sqlite", "sqlserver", "oracle", "db2")Contoh:
$ value = $ column -> opt ( ' length ' );
$ column -> opt ( ' length ' , 64 );
Menetapkan presisi kolom atau mengembalikan nilai saat ini
public function precision( int $ value = null )
$value
kolom baru nilai presisi atau nol untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> precision ();
$ column -> precision ( 10 );
Membuat indeks utama untuk kolom
public function primary( string $ name = null ) : self
$name
indeks atau nol untuk menghasilkan secara otomatisContoh:
$ column -> primary ();
$ column -> primary ( ' pk_col ' );
Mengatur skala kolom atau mengembalikan nilai saat ini
public function scale( int $ value = null )
$value
skala kolom baru nilai atau nol untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> scale ();
$ column -> scale ( 3 );
Menetapkan kolom sebagai autoINCREMENT atau mengembalikan nilai saat ini
public function seq( bool $ value = null )
$value
bendera autoINCREMENT baru atau nol untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> seq ();
$ column -> seq ( true );
Membuat indeks spasial untuk kolom
public function spatial( string $ name = null ) : self
$name
indeks atau nol untuk menghasilkan secara otomatisContoh:
$ column -> spatial ();
$ column -> spatial ( ' idx_col ' );
Menetapkan jenis kolom atau mengembalikan nilai saat ini
public function type( string $ value = null )
$value
jenis kolom baru atau null untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> type ();
$ column -> type ( ' tinyint ' );
Membuat indeks unik untuk kolom
public function unique( string $ name = null ) : self
$name
indeks atau nol untuk menghasilkan secara otomatisContoh:
$ column -> unique ();
$ column -> unique ( ' unq_col ' );
Setel kolom bendera unsigned atau mengembalikan nilai saat ini
public function unsigned( bool $ value = null )
$value
kolom baru bendera unsigned atau null untuk mengembalikan nilai saat iniContoh:
$ value = $ column -> unsigned ();
$ column -> unsigned ( true );
Menerapkan perubahan pada skema database
public function up() : self
Contoh:
$ column -> up ();
Upscheme menawarkan dukungan untuk kendala kunci asing, yang menegakkan integritas data antara dua tabel. Misalnya, jika kolom parentid
dari tabel users_address
merujuk kolom id
tabel users
, tidak ada baris di tabel users_address
tanpa baris yang cocok di tabel users
. Metode Calling the foreign()
akan menciptakan kendala seperti itu:
$ this -> db ()-> table ( ' users ' , function ( $ table ) {
$ table -> id ();
} );
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' );
} );
Catatan: Kolom ( parentid
) akan dan harus memiliki tipe data yang sama dan pengubah kolom dengan kolom yang dirujuk ( id
). Metode foreign()
memastikan bahwa dan akan membuat indeks baru dengan nama yang sama dengan kendala kunci asing secara otomatis.
Jika kolom ID di tabel users
dinamai secara berbeda, lewati namanya sebagai parameter ketiga ke metode foreign()
:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' , ' uid ' );
} );
Disarankan untuk meneruskan nama kendala kunci asing sebagai parameter Forth sehingga lebih mudah untuk mengubah atau menjatuhkan kendala nanti:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' , ' id ' , ' fk_test_pid ' );
} );
Jika ada lebih dari satu kolom yang diperlukan untuk mendapatkan nilai unik yang diperlukan oleh kunci asing, lewati nama kolom sebagai array:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( [ ' parentid ' , ' siteid ' ], ' users_address ' , [ ' id ' , ' siteid ' ] );
} );
Kendala kunci asing dapat melakukan tindakan yang berbeda jika kolom yang direferensikan di tabel asing dihapus dari yang diperbarui. Tindakan standar adalah membatasi menghapus baris atau memperbarui nilai ID yang direferensikan. Untuk mengubah perilaku, gunakan metode onDelete()
dan onUpdate()
:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' )-> onDelete ( ' SET NULL ' )-> onUpdate ( ' RESTRICT ' );
} );
Ada jalan pintas jika Anda ingin mengatur kedua nilai ke nilai yang sama:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' )-> do ( ' SET NULL ' );
} );
Nilai yang mungkin untuk kedua metode adalah:
Tindakan default saat menghapus atau memperbarui baris adalah kaskade sehingga nilai -nilai kolom kunci asing diperbarui ke nilai yang sama seperti pada tabel asing.
Untuk memeriksa apakah kunci asing sudah ada, gunakan metode hasForeign()
:
if ( $ this -> db ()-> hasForeign ( ' users_address ' , ' fk_usrad_parentid ' ) ) {
// The "fk_usrad_parentid" foreign key in the " users_address " table exists
}
Dimungkinkan juga untuk memeriksa beberapa kendala kunci asing sekaligus. Kemudian, metode hasForeign()
hanya akan mengembalikan true jika semua kendala ada dalam tabel yang dilewati sebagai argumen pertama:
if ( $ this -> db ()-> hasForeign ( ' users_address ' , [ ' fk_usrad_parentid ' , ' fk_usrad_siteid ' ] ) ) {
// The "fk_usrad_parentid" and "fk_usrad_siteid" foreign keys exist in the "users_address" table
}
Jika objek tabel tersedia, metode tabel hasForeign()
dapat digunakan sebagai gantinya:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> hasForeign ( ' fk_usrad_parentid ' ) ) {
// The "fk_usrad_parentid" foreign key in the " users_address " table exists
}
} );
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> hasForeign ( [ ' fk_usrad_parentid ' , ' fk_usrad_siteid ' ] ) ) {
// The "fk_usrad_parentid" and "fk_usrad_siteid" foreign keys exist in the "users_address" table
}
} );
Jika Anda membutuhkan nilai -nilai saat ini dari kendala yang ada:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ fk = $ table -> foreign ( ' parentid ' , ' users ' );
// returns the name of the constraint
$ name = $ fk -> name ()
// returns the action when deleting rows
$ action = $ fk -> onDelete ;
// returns the action when updating the foreign ID
$ action = $ fk -> onUpdate ;
} );
Untuk menghapus kendala kunci asing dari tabel, gunakan metode dropForeign()
dan berikan nama tabel dan nama kunci asing sebagai argumen:
$ this -> db ()-> dropForeign ( ' users_address ' , ' fk_usrad_parentid ' );
Anda juga dapat melewati beberapa nama kunci asing untuk mengantarnya sekaligus:
$ this -> db ()-> dropForeign ( ' users_address ' , [ ' fk_usrad_parentid ' , ' fk_usrad_siteid ' ] );
Dalam fungsi anonim yang diteruskan ke metode table()
, Anda juga dapat menggunakan metode dropForeign()
:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> dropForeign ( ' fk_usrad_parentid ' );
} );
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> dropForeign ( [ ' fk_usrad_parentid ' , ' fk_usrad_siteid ' ] );
} );
Panggilan metode khusus
public function __call( string $ method , array $ args )
$method
nama metode ini$args
Metode parameterContoh:
Anda dapat mendaftarkan metode khusus yang memiliki akses ke properti kelas dari objek asing UPSCHEME:
Aimeos Upscheme Schema Foreign:: macro ( ' default ' , function () {
$ this -> opts = [ ' onDelete ' => ' SET NULL ' , ' onUpdate ' => ' SET NULL ' ];
} );
$ foreign -> default ();
Properti kelas yang tersedia adalah:
$this->dbaltable
: skema tabel doktrin
$this->table
: objek tabel upscheme
$this->localcol
: nama atau nama kolom lokal
$this->fktable
: nama tabel asing
$this->fkcol
: nama atau nama kolom asing
$this->name
: nama kunci asing
$this->opts
: Daftar asosiatif opsi kunci asing (terutama "OnDelete" dan "OnUpdate")
Mengembalikan nilai untuk opsi kunci asing yang diberikan
public function __get( string $ name )
$name
nama opsi kunci asingDaftar opsi kunci asing yang tersedia adalah:
Nilai yang mungkin untuk kedua opsi adalah:
Contoh:
$ value = $ foreign -> onDelete ;
// same as
$ value = $ foreign -> opt ( ' onDelete ' );
Menetapkan nilai baru untuk opsi kunci asing yang diberikan
public function __set( string $ name , $ value )
$name
nama opsi kunci asingDaftar opsi kunci asing yang tersedia adalah:
Nilai yang mungkin untuk kedua opsi adalah:
Contoh:
$ foreign -> onDelete = ' SET NULL ' ;
// same as
$ foreign -> onDelete ( ' SET NULL ' );
$ foreign -> opt ( ' onDelete ' , ' SET NULL ' );
Menetapkan nilai baru untuk opsi kunci asing yang diberikan
public function do( string $ action ) : self
$action
melakukan tindakanTindakan yang mungkin dilakukan adalah:
Contoh:
$ foreign -> do ( ' RESTRICT ' );
public function name()
Contoh:
$ fkname = $ foreign -> name ();
public function onDelete( string $ value = null )
@param string | null $value
melakukan tindakan atau nol untuk mengembalikan nilai saat ini
@return self | string objek yang sama untuk mengatur nilai, nilai saat ini tanpa parameter
Tindakan yang tersedia adalah:
Contoh:
$ value = $ foreign -> onDelete ();
$ foreign -> onDelete ( ' SET NULL ' );
// same as
$ foreign -> onDelete = ' SET NULL ' ;
// same as
$ foreign -> opt ( ' onDelete ' , ' SET NULL ' );
$ foreign -> onDelete ( ' SET NULL ' )-> onUpdate ( ' SET NULL ' );
public function onUpdate( string $ value = null )
@param string | null $value
melakukan tindakan atau nol untuk mengembalikan nilai saat ini
@return self | string objek yang sama untuk mengatur nilai, nilai saat ini tanpa parameter
Tindakan yang tersedia adalah:
Contoh:
$ value = $ foreign -> onUpdate ();
$ foreign -> onUpdate ( ' SET NULL ' );
// same as
$ foreign -> onUpdate = ' SET NULL ' ;
// same as
$ foreign -> opt ( ' onUpdate ' , ' SET NULL ' );
$ foreign -> onUpdate ( ' SET NULL ' )-> onDelete ( ' SET NULL ' );
public function up() : self
Contoh:
$ foreign -> up ();
Beberapa implementasi database menawarkan sekuens alih-alih kolom pendaratan otomatis/identitas, yaitu Oracle dan PostgreSQL. Urutan adalah fungsi yang membuat angka peningkatan secara berurutan yang diterapkan ke kolom tabel saat memasukkan baris baru. Untuk membuat urutan baru bernama SEQ_TEST Gunakan metode sequence()
:
$ this -> db ()-> sequence ( ' seq_test ' );
Untuk menggunakan nilai awal yang berbeda dan lebar langkah dari 1
, hubungi metode start()
dan step()
:
$ this -> db ()-> sequence ( ' seq_test ' , function ( $ seq ) {
$ seq -> start ( 1000 )-> step ( 2 );
} );
Untuk memeriksa apakah urutan sudah ada, gunakan metode hasSequence()
:
if ( $ this -> db ()-> hasSequence ( ' seq_test ' ) ) {
// The "seq_test" sequence exists
}
Dimungkinkan juga untuk memeriksa beberapa urutan sekaligus. Kemudian, metode hasSequence()
hanya akan mengembalikan true jika semua urutan ada:
if ( $ this -> db ()-> hasSequence ( [ ' seq_id ' , ' seq_test ' ] ) ) {
// The "seq_id" and "seq_test" sequences exist
}
Jika Anda perlu mengetahui nilai -nilai saat ini dari opsi tabel:
$ this -> db ()-> sequence ( ' seq_test ' , function ( $ seq ) {
// returns how many generated numbers are cached
$ cache = $ seq -> cache ;
// returns the number the sequence has started from
$ start = $ seq -> start ;
// returns the step width for newly generated numbers
$ step = $ seq -> step ;
} );
Untuk menghapus urutan, gunakan metode dropSequence()
dan lewati nama urutan sebagai argumen:
$ this -> db ()-> dropSequence ( ' seq_id ' );
Anda juga dapat melewati beberapa nama urutan untuk mengantarnya sekaligus:
$ this -> db ()-> dropSequence ( [ ' seq_id ' , ' seq_test ' ] );
Panggilan Metode Kustom atau Melewati Panggilan Metode Tidak Diketahui ke Objek Tabel Doktrin
public function __call( string $ method , array $ args )
$method
nama metode ini$args
Metode parameterContoh:
Anda dapat mendaftarkan metode khusus yang memiliki akses ke properti kelas dari objek urutan upscheme:
Aimeos Upscheme Schema Sequence:: macro ( ' default ' , function () {
$ this -> start ( 1 )-> step ( 2 );
} );
$ sequence -> default ();
Properti kelas yang tersedia adalah:
$this->db
: objek db upscheme
$this->sequence
: skema urutan doktrin
Mengembalikan nilai untuk opsi urutan yang diberikan
public function __get( string $ name )
$name
Opsi urutan namaContoh:
$ value = $ sequence -> getInitialValue ();
// same as
$ value = $ sequence -> start ();
Menetapkan nilai baru untuk opsi urutan yang diberikan
public function __set( string $ name , $ value )
$name
Opsi urutan namaContoh:
$ value = $ sequence -> setInitialValue ( 1000 );
// same as
$ value = $ sequence -> start ( 1000 );
Mengatur ukuran urutan yang di -cache atau mengembalikan nilai saat ini
public function cache( int $ value = null )
$value
jumlah baru id urutan di -cache oleh klien atau nol untuk mengembalikan nilai saat iniContoh:
$ value = $ sequence -> cache ();
$ sequence -> cache ( 100 );
Mengembalikan nama urutan
public function name()
$ name = $ sequence -> name ();
Menetapkan nilai awal yang baru dari urutan atau mengembalikan nilai saat ini
public function start( int $ value = null )
$value
nilai awal baru dari urutan atau nol untuk mengembalikan nilai saat ini $ value = $ sequence -> start ();
$ sequence -> start ( 1000 );
Menetapkan ukuran langkah nilai urutan baru atau mengembalikan nilai saat ini
public function step( int $ value = null )
$value
ukuran langkah baru urutannya bertambah atau dikurangi oleh atau nol untuk mengembalikan nilai saat ini $ value = $ sequence -> step ();
$ sequence -> step ( 2 );
Menerapkan perubahan pada skema database
public function up() : self
$ sequence -> up ();
Indeks mempercepat kueri basis data dan waktu yang dibutuhkan kueri dapat turun dari beberapa menit ke milidetik jika digunakan dengan benar. Ada beberapa jenis indeks yang tersedia:
Semua indeks dapat terdiri dari satu atau lebih kolom tetapi urutan kolom memiliki dampak besar jika indeks digunakan untuk kueri atau tidak.
Semua indeks terikat pada tabel yang berisi kolom yang dicakup indeks. Cara paling sederhana untuk membuat indeks pada satu kolom adalah dengan menggunakan metode index()
dari objek kolom:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' label ' )-> index ();
} );
Parameter kedua dari metode index()
memungkinkan Anda untuk mengatur nama khusus untuk indeks:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' label ' )-> index ( ' idx_test_label ' );
} );
Catatan: Untuk kompatibilitas maksimum antara jenis database yang berbeda, panjang nama indeks harus 30 karakter atau kurang.
Hal yang sama dimungkinkan untuk indeks primer, unik dan spasial:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
// primary key
$ table -> int ( ' id ' )-> primary ();
$ table -> int ( ' id ' )-> primary ( ' pk_test_id ' ); // ignored by MySQL , MariaDB , etc .
// unique key
$ table -> string ( ' code ' )-> unique ();
$ table -> string ( ' code ' )-> unique ( ' unq_test_code ' );
// spatial index
$ table -> col ( ' location ' , ' point ' )-> spatial ();
$ table -> col ( ' location ' , ' point ' )-> spatial ( ' idx_test_location ' );
} );
Untuk indeks multi-kolom, metode primary()
, unique()
dan index()
tersedia di objek tabel:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
// primary composite index
$ table -> primary ( [ ' siteid ' , ' code ' ] );
// unique composite index
$ table -> unique ( [ ' parentid ' , ' type ' ] );
// regular composite index
$ table -> index ( [ ' label ' , ' status ' ] );
} );
Indeks spasial tidak dapat menjangkau beberapa kolom tetapi membuatnya juga dimungkinkan menggunakan metode spatial()
dari objek tabel:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> spatial ( ' location ' );
} );
Untuk memeriksa apakah indeks sudah ada, gunakan metode hasIndex()
:
if ( $ this -> db ()-> hasIndex ( ' users ' , ' idx_users_name ' ) ) {
// The "idx_users_name" index in the "users" table exists
}
You can check for several indexes at once too. In that case, the hasIndex()
method will only return TRUE if all indexes exist:
if ( $ this -> db ()-> hasIndex ( ' users ' , [ ' idx_users_name ' , ' idx_users_status ' ] ) ) {
// The "idx_users_name" and "idx_users_status" indexes in the "users" table exists
}
If you already have a table object, you can use hasIndex()
as well:
if ( $ table -> hasIndex ( ' idx_users_name ' ) ) {
// The "idx_users_name" index in the table exists
}
if ( $ table -> hasIndex ( [ ' idx_users_name ' , ' idx_users_status ' ] ) ) {
// The "idx_users_name" and "idx_users_status" indexes in the table exists
}
To rename indexes directly, using the renameIndex()
method of the DB schema:
// single index
$ this -> db ()-> renameIndex ( ' testtable ' , ' idx_test_label ' , ' idx_test_name ' );
// multiple indexes
$ this -> db ()-> renameIndex ( ' testtable ' , [ ' idx_test_label ' => ' idx_test_name ' , ' idx_text_stat ' => ' idx_test_status ' ] );
If a table object is already available, you can use its renameIndex()
method to rename one or more indexes:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
// single index
$ table -> renameIndex ( ' idx_test_label ' , ' idx_test_name ' );
// multiple indexes
$ table -> renameIndex ( [ ' idx_test_label ' => ' idx_test_name ' , ' idx_text_stat ' => ' idx_test_status ' ] );
} );
In all cases, indexes are only renamed if they exist. No error is reported if one or more indexes doesn't exist in the table.
To drop indexes, use the dropIndex()
method from the DB schema object:
$ this -> db ()-> dropIndex ( ' users ' , ' idx_test_name ' );
You can drop several indexes at once if you pass the name of all indexes you want to drop as array:
$ this -> db ()-> dropIndex ( ' users ' , [ ' idx_test_name ' , ' idx_test_status ' ] );
If you already have a table object, you can use dropIndex()
too:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
// single index
$ table -> dropIndex ( ' idx_test_name ' );
// multiple indexes
$ table -> dropIndex ( [ ' idx_test_name ' , ' idx_test_status ' ] );
} );
In all cases, indexes are only removed if they exist. No error is reported if one or more indexes doesn't exist in the table.
It's not necessary to pass a custom index name when creating new indexes. Then, the index name is generated automatically but their name will consist of a hash that is hard to read. Also, you don't know which columns the indexes span from the index name.
Upscheme allows you to add your own naming function for indexes which is used if not index name is passed to the methods for creating indexes. Before running the migrations, register your nameing function using the macro()
method in the table objects:
use Aimeos Upscheme Schema Table ;
Table:: marco ( ' nameIndex ' , function ( string $ table , array $ columns , string $ type ) {
return $ type . ' _ ' . $ table . ' _ ' . join ( ' _ ' , $ columns );
} );
Aimeos Upscheme Up:: use ( $ config , ' ./migrations/ ' )-> up ()
For a table "testtable", a column "label" and the type "idx", this will return idx_testtable_label instead of a hash.
Available index types are:
Note: For compatibility to all supported database types, the maximum length of the index names must be not longer than 30 characters!
You can add new methods to all Upscheme objects using the macro()
method. Each custom method has access to the class properties and methods of the class it's registered for including the Doctrine DBAL objects.
To register a method named test()
in the DB schema object with two parameters $arg1
and $arg2
which has access to the same class properties as the DB __call()
method use:
Aimeos Upscheme Schema DB :: marco ( ' test ' , function ( $ arg1 , $ arg2 ) {
// $ this - >conn : Doctrine connection
// $this - >from : Doctrine start schema
// $this - >to : Doctrine current schema
// $ this - >up : Upscheme object
// return $this or a value
} );
$ db -> test ( ' key ' , ' value ' );
Registering a method test()
in the Table schema object with one parameter $arg1
which has access to the same class properties as the Table __call()
method use:
Aimeos Upscheme Schema Table:: marco ( ' test ' , function ( $ arg1 ) {
// $this - >db : Upscheme DB object
// $this - >table : Doctrine Table object
// return $this or a value
} );
$ table -> test ( ' something ' );
Same for a method test()
in the Column schema object with an optional parameter $value
which has access to the same class properties as the Column __call()
method use:
Aimeos Upscheme Schema Column:: marco ( ' test ' , function ( $ value = null ) {
// $this - >db : Upscheme DB object
// $this - >table : Upscheme Table object
// $this - >column : Doctrine Column object
// return $this or a value
} );
$ column -> test ();
To extend the Foreign object for foreign key constraints with a test()
method with no parameter having access to the same class properties as the Foreign __call()
method use:
Aimeos Upscheme Schema Foreign:: marco ( ' test ' , function () {
// $this - >table : Upscheme Table object
// $this - >dbaltable : Doctrine Table object
// $this - >localcol : Array of local column names
// $this - >fktable : Foreign table name
// $ this - >fkcol : Foreign table column names
// $this - >name : Foreign key name
// $ this - >opts : Array of foreign key options ( "onDelete" and "onUpdate")
// return $this or a value
} );
$ foreign -> test ();
Finally, extending the Sequence object with a test()
method having no parameters and access to the same class properties as the Sequence __call()
method use:
Aimeos Upscheme Schema Sequence:: marco ( ' test ' , function () {
// $this - >db : Upscheme DB object
// $this - >sequence : Doctrine Sequence object
// return $this or a value
} );
$ sequence -> test ();
Instead of calling the col()
method of the Table object with all parameters and modifiers each time, you can create your own shortcut methods, eg:
Aimeos Upscheme Schema Table:: marco ( ' utinyint ' , function ( string $ name ) {
return $ this -> col ( $ name , ' tinyint ' )-> unsigned ( true );
} );
It's also possible to create several columns at once if you want to add them to several tables:
Aimeos Upscheme Schema Table:: marco ( ' defaults ' , function () {
$ this -> id ();
$ this -> datetime ( ' ctime ' );
$ this -> datetime ( ' mtime ' );
$ this -> string ( ' editor ' );
return $ this ;
} );
Then, use your custom methods when creating or updating tables:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> defaults ();
$ table -> utinyint ( ' status ' );
} );
Version 0.9+ supports Doctrine DBAL 3.x/4.x and dropped support for Doctrine DBAL 2.x.
DB::type()
returns mariadb
instead of mysql
for MariaDDB databaseDB::type()
returns sqlserver
instead of mssql
for Microsoft SQLServer databaseDB::for()
, DB::view()
and Column::opt
require ['mariadb', 'mysql']
to get the same resultsDB::lastId()
doesn't require/support passing a sequence name because Doctrine DBAL removed it but doesn't support Oracle IDENTITY columns at the moment