แพ็คเกจ PHP ที่ใช้งานง่ายสำหรับการอัปเดตสคีมาฐานข้อมูลของแอปพลิเคชันของคุณและย้ายข้อมูลระหว่างเวอร์ชัน
composer req aimeos/upscheme
สารบัญ
การย้ายข้อมูลเป็นเหมือนการควบคุมเวอร์ชันสำหรับฐานข้อมูลของคุณ ช่วยให้คุณได้รับสถานะเดียวกันทุกประการในทุกการติดตั้ง เมื่อใช้ Upscheme คุณจะได้รับ:
ต่อไปนี้เป็นตัวอย่างคำจำกัดความของตารางที่คุณสามารถปรับเปลี่ยนเมื่อใดก็ตามที่เค้าโครงตารางของคุณต้องเปลี่ยนแปลง จากนั้น Upscheme จะเพิ่มและแก้ไขคอลัมน์และคุณสมบัติของตารางที่มีอยู่โดยอัตโนมัติ (แต่จะไม่ลบสิ่งใดด้วยเหตุผลด้านความปลอดภัย):
$ 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 ' ] );
} );
สำหรับการอัพเกรดสกีมาฐานข้อมูลเชิงสัมพันธ์ ปัจจุบันมีการใช้แพ็คเกจสองแพ็คเกจบ่อยที่สุด: Doctrine DBAL และ Doctrine Migration แม้ว่า Doctrine DBAL จะทำงานได้ดีในการสรุปความแตกต่างของการใช้งานฐานข้อมูลต่างๆ แต่ API จำเป็นต้องเขียนโค้ดจำนวนมาก การโยกย้ายหลักคำสอนบนไซต์อื่นมีข้อเสียบางประการซึ่งทำให้ยากต่อการใช้งานในทุกแอปพลิเคชันที่รองรับส่วนขยายของบุคคลที่สาม
API ของ DBAL นั้นละเอียดมากและคุณจำเป็นต้องเขียนโค้ดจำนวนมาก แม้กระทั่งสำหรับสิ่งง่ายๆ Upscheme ใช้ Doctrine DBAL เพื่อเสนอ API ที่ใช้งานง่ายสำหรับการอัพเกรดสคีมาฐานข้อมูลของแอปพลิเคชันของคุณด้วยโค้ดที่น้อยที่สุด สำหรับตัวอย่าง Upscheme ด้านบน บรรทัดโค้ดเหล่านี้เทียบเท่ากับ DBAL ในการย้าย:
$ 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 );
}
Doctrine Migration อาศัยคลาสการโยกย้ายที่ได้รับการตั้งชื่อตามเวลาที่ถูกสร้างขึ้นเพื่อให้แน่ใจว่ามีลำดับที่แน่นอน นอกจากนี้ยังจัดเก็บการโยกย้ายที่ได้ดำเนินการไว้ในตารางฐานข้อมูลของคุณ มีปัญหาสำคัญสามประการที่เกิดขึ้นจากสิ่งนั้น:
down()
หากแอปพลิเคชันของคุณรองรับส่วนขยายของบุคคลที่สาม ส่วนขยายเหล่านี้มีแนวโน้มที่จะเพิ่มคอลัมน์ลงในตารางที่มีอยู่และย้ายข้อมูลด้วยตนเอง เนื่องจากไม่มีวิธีกำหนดการพึ่งพาระหว่างการย้ายข้อมูล จึงแทบเป็นไปไม่ได้เลยที่จะเรียกใช้การย้ายข้อมูลในแอปพลิเคชันที่มีส่วนขยายของบุคคลที่สามหลายรายการโดยไม่มีข้อขัดแย้ง เพื่อหลีกเลี่ยงปัญหาดังกล่าว Upscheme จึงเสนอวิธีการ before()
และ after()
ที่ใช้งานง่ายในแต่ละงานการโยกย้าย ซึ่งงานสามารถกำหนดการขึ้นต่อกันกับงานอื่น ๆ ได้
เนื่องจาก Doctrine Migrations ใช้ตารางฐานข้อมูลเพื่อบันทึกว่าการโยกย้ายใดที่ได้ดำเนินการไปแล้ว เร็กคอร์ดเหล่านี้จึงไม่ซิงค์กันได้ง่ายในกรณีที่เกิดปัญหา ตรงกันข้าม Upscheme อาศัยเฉพาะสคีมาจริงเท่านั้น ดังนั้นจึงเป็นไปได้ที่จะอัปเกรดจากสถานะใดก็ได้ โดยไม่คำนึงถึงสิ่งที่เกิดขึ้นก่อนหน้านี้
Doctrine Migrations ยังรองรับการดำเนินการย้อนกลับในเมธอด down()
เพื่อให้คุณสามารถย้อนกลับการโยกย้ายซึ่ง Upscheme ไม่มี ประสบการณ์ได้แสดงให้เห็นว่ามักเป็นไปไม่ได้ที่จะย้อนกลับการย้ายข้อมูล เช่น หลังจากเพิ่มคอลัมน์ใหม่ การย้ายข้อมูลของคอลัมน์ที่มีอยู่ และทิ้งคอลัมน์เก่าในภายหลัง หากการย้ายข้อมูลสูญหาย คุณจะไม่สามารถสร้างสถานะเดิมขึ้นใหม่โดยใช้เมธอด down()
กรณีเดียวกันหากคุณทำโต๊ะตก ดังนั้น Upscheme จึงเสนอการอัพเกรดโครงร่างเท่านั้น แต่ไม่มีการลดระดับเพื่อหลีกเลี่ยงการสูญเสียข้อมูลโดยนัย
Upscheme ใช้ Doctrine DBAL สำหรับการสรุปจากการใช้งานเซิร์ฟเวอร์ฐานข้อมูลที่แตกต่างกัน DBAL รองรับระบบจัดการฐานข้อมูลเชิงสัมพันธ์หลักทั้งหมด (RDBMS) แต่มีระดับการสนับสนุนที่แตกต่างกันสำหรับคุณสมบัติที่มีอยู่:
การสนับสนุนที่ดี:
การสนับสนุนที่จำกัด:
หลังจากที่คุณได้ติดตั้งแพ็คเกจ aimeos/upscheme
โดยใช้ composer แล้ว คุณสามารถใช้คลาส Up
เพื่อดำเนินงานการย้ายข้อมูลของคุณได้:
$ config = [
' driver ' => ' pdo_mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' dbname ' => ' <database> ' ,
' user ' => ' <dbuser> ' ,
' password ' => ' <secret> '
];
Aimeos Upscheme Up:: use ( $ config , ' src/migrations ' )-> up ();
เมธอด Up::use()
ต้องใช้พารามิเตอร์สองตัว: การกำหนดค่าฐานข้อมูลและเส้นทางไปยังงานการย้ายข้อมูล สำหรับการกำหนดค่า Doctrine DBAL จะต้องรองรับคีย์อาร์เรย์และค่า ไดรเวอร์ ไดรเวอร์ที่มีจำหน่ายคือ:
ฐานข้อมูลบางแห่งต้องการพารามิเตอร์ที่แตกต่างกัน SQLite และ Oracle ที่โดดเด่นที่สุด:
SQLite:
$ config = [
' driver ' => ' pdo_sqlite ' ,
' path ' => ' path/to/file.sq3 '
];
ออราเคิล:
$ 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> '
];
หากคุณไม่เคยใช้ Doctrine DBAL มาก่อน การกำหนดค่าฐานข้อมูลของคุณอาจมีโครงสร้างที่แตกต่างกันและ/หรือใช้ค่าที่แตกต่างกันสำหรับประเภทฐานข้อมูล Upscheme ช่วยให้คุณสามารถลงทะเบียนวิธีการแบบกำหนดเองที่จะแปลงการกำหนดค่าของคุณเป็นการตั้งค่า DBAL ที่ถูกต้อง เช่น:
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 ยังรองรับการเชื่อมต่อฐานข้อมูลหลายแบบ ซึ่งคุณสามารถแยกแยะได้ด้วยชื่อคีย์:
$ 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 ();
แน่นอน คุณสามารถผ่านเส้นทางการโยกย้ายหลายเส้นทางไปยังคลาส Up
ได้:
Aimeos Upscheme Up:: use ( $ config , [ ' src/migrations ' , ' ext/migrations ' ] )-> up ();
หากต้องการเปิดใช้งาน (การดีบัก) เอาต์พุตให้ใช้เมธอด 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
งานการย้ายข้อมูลจำเป็นต้องใช้เมธอด up()
เท่านั้น และจะต้องจัดเก็บไว้ในไดเร็กทอรีใดไดเร็กทอรีที่ส่งผ่านไปยังคลาส 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 ' );
} );
}
};
ในไฟล์ PHP ของคุณ ให้ใส่คำสั่ง namespace
ก่อนเสมอ คำสั่ง use
เป็นทางเลือกและจำเป็นต้องใช้เป็นทางลัดสำหรับคำใบ้ประเภทสำหรับอาร์กิวเมนต์ฟังก์ชันปิดเท่านั้น คลาสของคุณจะต้องขยายจากคลาสงาน "Base" หรือใช้อินเทอร์เฟซงาน "Iface"
นอกเหนือจากคลาสที่ไม่ระบุชื่อ คุณสามารถใช้คลาสที่มีชื่อสำหรับงานการย้ายข้อมูลได้:
<?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 ' );
} );
}
}
ไฟล์ที่คลาสของคุณจัดเก็บต้องมีชื่อเดียวกัน (คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) เช่นเดียวกับคลาสนั้นและส่วนต่อท้าย .php
เช่น:
class TestTable -> TestTable.php
ไม่มีหลักการที่เข้มงวดในการตั้งชื่อไฟล์งานการย้ายข้อมูล คุณสามารถตั้งชื่อตามสิ่งที่พวกเขาทำ (เช่น "CreateTestTable.php") สิ่งที่พวกเขาดำเนินการ (เช่น "TestTable.php") หรือแม้แต่ใช้การประทับเวลา (เช่น "20201231_Test.php")
หากงานไม่มีการขึ้นต่อกัน งานเหล่านั้นจะถูกจัดเรียงและดำเนินการตามลำดับตัวอักษรตามชื่อไฟล์ และการเรียงลำดับจะเป็น:
20201231_Test.php
CreateTestTable.php
TestTable.php
หากต้องการระบุการขึ้นต่อกันกับงานการย้ายข้อมูลอื่นๆ ให้ใช้เมธอด after()
และ before()
งานของคุณจะถูกดำเนินการหลังจากงานที่ส่งคืนโดย after()
และก่อนงานที่ส่งคืนโดย before()
:
return new class ( $ this ) extends Base {
public function after () : array
{
return [ ' CreateRefTable ' ];
}
public function before () : array
{
return [ ' InsertTestData ' ];
}
}
ชื่องานคือชื่อไฟล์ของงานที่ไม่มีส่วนต่อท้าย . .php
หากตัวอย่างการย้ายถูกเก็บไว้ในไฟล์ TestTable.php
ลำดับของการดำเนินการจะเป็น:
CreateRefTable.php -> TestTable.php -> InsertTestData.php
หากต้องการส่งข้อความในงานการย้ายข้อมูลของคุณให้ใช้เมธอด info()
:
$ this -> info ( ' some message ' );
$ this -> info ( ' more verbose message ' , ' vv ' );
$ this -> info ( ' very verbose debug message ' , ' vvv ' );
พารามิเตอร์ที่สองคือระดับการใช้คำฟุ่มเฟือย และไม่มีหรือ v
เป็นข้อความมาตรฐาน vv
คือข้อความที่จะแสดงเฉพาะเมื่อต้องการใช้คำฟุ่มเฟือยมากขึ้น ในขณะที่ vvv
ใช้สำหรับการแก้ไขข้อความ นอกจากนี้ยังมีพารามิเตอร์ที่สามสำหรับการเยื้องข้อความ:
$ this -> info ( ' some message ' );
$ this -> info ( ' second level message ' , ' v ' , 1 );
$ this -> info ( ' third level message ' , ' v ' , 2 );
สิ่งนี้จะแสดง:
some message
second level message
third level message
สิ่งที่จำเป็นต้องมีคือเมธอด verbose()
ของคลาส Up
ได้ถูกเรียกมาก่อน:
Aimeos Upscheme Up:: use ( $ config , ' ... ' )-> verbose ()-> up ();
ในเมธอด up()
คุณสามารถเข้าถึงสคีมาฐานข้อมูลได้โดยใช้เมธอด db()
ในกรณีที่คุณส่งการกำหนดค่าฐานข้อมูลมากกว่าหนึ่งรายการไปที่ Up::use()
คุณสามารถเข้าถึงสคีมาต่างๆ ได้ด้วยคีย์การกำหนดค่า:
// $config = [ 'db' => [ ... ] , 'temp' => [ ... ] ] ;
// Aimeos UpschemeUp::use( $config , '...' )->up() ;
$ this -> db ();
$ this -> db ( ' db ' );
$ this -> db ( ' temp ' );
หากคุณไม่ส่งคีย์การกำหนดค่าหรือคีย์ที่ไม่มีอยู่ การกำหนดค่าแรกจะถูกส่งกลับ (ในกรณีนี้คือ "db") ด้วยการใช้วิธีการที่มีอยู่ของออบเจ็กต์สคีมาฐานข้อมูล คุณสามารถเพิ่ม อัปเดต หรือปล่อยตาราง คอลัมน์ ดัชนี และออบเจ็กต์ฐานข้อมูลอื่นๆ ได้ นอกจากนี้คุณยังสามารถใช้ insert()
, select()
, update()
, delete()
และ stmt()
เพื่อจัดการบันทึกของตาราง
หลังจากงานการย้ายแต่ละครั้ง การอัปเดตสคีมาที่ทำในงานจะถูกนำไปใช้กับฐานข้อมูลโดยอัตโนมัติ หากคุณต้องการยืนยันการเปลี่ยนแปลงทันทีเนื่องจากต้องการแทรกข้อมูล ให้เรียก $this->db()->up()
ด้วยตัวเอง เมธอด up()
ยังมีอยู่ในออบเจ็กต์ตาราง ลำดับ และคอลัมน์ ดังนั้นคุณจึงสามารถเรียก up()
ได้ทุกที่
ในกรณีที่คุณต้องการการเชื่อมต่อฐานข้อมูลที่แตกต่างกันสองรายการเนื่องจากคุณต้องการดำเนินการคำสั่ง SELECT และ INSERT/UPDATE/DELETE พร้อมกัน ให้ส่ง TRUE เป็นพารามิเตอร์ตัวที่สองไปที่ db()
เพื่อรับสคีมาฐานข้อมูลรวมถึงการเชื่อมต่อใหม่:
$ 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 ] );
การเปลี่ยนแปลงสคีมาทั้งหมดที่ทำจะถูกนำไปใช้กับฐานข้อมูลก่อนที่จะส่งคืนสคีมาที่มีการเชื่อมต่อใหม่ เพื่อหลีกเลี่ยงไม่ให้การเชื่อมต่อฐานข้อมูลกองพะเนินจนเซิร์ฟเวอร์ฐานข้อมูลปฏิเสธการเชื่อมต่อใหม่ ให้เรียก close()
เสมอสำหรับการเชื่อมต่อใหม่ที่สร้างโดย db( '<name>', true )
:
$ db2 -> close ();
แทนที่จะเขียนการโยกย้ายสำหรับออบเจ็กต์ฐานข้อมูลของคุณด้วยตนเอง คุณสามารถสร้างไฟล์การโยกย้ายโดยอัตโนมัติโดยใช้:
$ config = [
' db ' => [
' driver ' => ' pdo_mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' dbname ' => ' <database> ' ,
' user ' => ' <dbuser> ' ,
' password ' => ' <secret> '
]
];
Aimeos Upscheme Up:: use ( $ config , ' migrations ' )-> create ();
สิ่งนี้จะสร้างหนึ่งไฟล์สำหรับแต่ละลำดับ ตาราง และมุมมองในไดเร็กทอรีที่ส่งผ่าน ( ./migrations/
ในตัวอย่างนี้) หากคุณมีฐานข้อมูลหลายฐานข้อมูลและต้องการสร้างการย้ายข้อมูลสำหรับฐานข้อมูลทั้งหมดพร้อมกัน ให้ส่งคีย์การเชื่อมต่อจากการกำหนดค่าเพื่อ create()
:
$ config = [
' db ' => [
' driver ' => ' pdo_mysql ' ,
// ...
],
' order ' => [
' driver ' => ' pdo_oci ' ,
// ...
]
];
Aimeos Upscheme Up:: use ( $ config , ' migrations ' )-> create ( [ ' db ' , ' order ' ] );
คุณได้รับออบเจ็กต์สคีมาฐานข้อมูลในงานของคุณโดยการเรียก $this->db()
ตามที่อธิบายไว้ในส่วนของสคีมา ช่วยให้คุณเข้าถึงสคีมาฐานข้อมูลได้อย่างเต็มที่ รวมถึงตาราง ลำดับ และออบเจ็กต์สคีมาอื่นๆ ทั้งหมด:
$ table = $ this -> db ()-> table ( ' users ' );
$ seq = $ this -> db ()-> sequence ( ' seq_users ' );
หากไม่มีตารางหรือลำดับ ก็จะถูกสร้างขึ้น มิฉะนั้น ตารางหรือวัตถุลำดับที่มีอยู่จะถูกส่งกลับ ในทั้งสองกรณี คุณสามารถแก้ไขออบเจ็กต์ได้ในภายหลัง และเพิ่ม เช่น คอลัมน์ใหม่ลงในตาราง
คุณสามารถทดสอบตาราง คอลัมน์ ดัชนี คีย์ภายนอก และลำดับได้โดยใช้สคีมาฐานข้อมูลที่ส่งคืนโดย $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
}
วัตถุฐานข้อมูลที่ส่งคืนโดย $this->db()
เสนอความเป็นไปได้ในการเปลี่ยนชื่อตาราง คอลัมน์ และดัชนีโดยใช้ renameTable()
, renameColumn()
และ 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 ' );
อ็อบเจ็กต์ฐานข้อมูลที่ส่งคืนโดย $this->db()
ยังมีวิธีการสำหรับการวางตาราง คอลัมน์ ดัชนี คีย์ต่างประเทศ และลำดับ:
$ 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 ' );
หากไม่มีตาราง คอลัมน์ ดัชนี คีย์นอก หรือลำดับ ก็จะถูกละเว้นโดยไม่แจ้งให้ทราบ สำหรับกรณีที่คุณต้องการทราบว่ามีอยู่หรือไม่ ให้ใช้เมธอด hasTable()
, hasColumn()
, hasIndex()
, hasForeign()
และ hasSeqence()
ก่อนที่จะอธิบายไว้ในส่วน "การตรวจสอบการมีอยู่"
วิธี insert()
, select()
, update()
และ delete()
เป็นวิธีที่ง่ายในการเพิ่ม ดึงข้อมูล แก้ไข และลบแถวในตารางใดก็ได้:
$ 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 ();
} );
หากคุณใช้ select()
พร้อมกันกับ insert()
, update()
หรือ delete()
คุณต้องสร้างการเชื่อมต่อฐานข้อมูลที่สอง เนื่องจากคำสั่ง select()
จะส่งคืนแถวในขณะที่คุณส่งคำสั่งใหม่ไปยังเซิร์ฟเวอร์ฐานข้อมูล ใช้งานได้เฉพาะกับการเชื่อมต่อที่แยกจากกันเท่านั้น ใช้งานไม่ได้กับการเชื่อมต่อเดียวกัน
หากต้องการรวมการดำเนินการลบ/แทรก/อัปเดตทั้งหมดไว้ในธุรกรรม คุณต้องใช้เมธอด transaction()
ของวัตถุฐานข้อมูล:
$ this -> db ()-> transaction ( function ( $ db ) {
// $db- > insert ( ... )
// $db- > update ( ... )
// $db- > delete ( ... )
} );
สิ่งนี้ทำให้แน่ใจได้ว่าการดำเนินการเขียนทั้งหมดจะดำเนินการแบบอะตอมมิกหรือไม่ดำเนินการเลยในกรณีที่เกิดข้อผิดพลาด วิธี transaction()
ช่วยให้มั่นใจได้ว่าธุรกรรมนั้นมีความมุ่งมั่นหรือย้อนกลับโดยอัตโนมัติหลังจากที่ฟังก์ชันที่ไม่ระบุชื่อของคุณส่งคืนการควบคุมไปยังวิธีนั้น
หากคุณต้องการพารามิเตอร์เพิ่มเติมภายในฟังก์ชันที่ไม่ระบุตัวตน คุณสามารถส่งมอบให้กับรายการ use
ของฟังก์ชันของคุณได้:
$ userid = 123 ;
$ this -> db ()-> transaction ( function ( $ db ) use ( $ userid ) {
$ db -> insert ( ' newusers ' , [ ' userid ' => userid, ' status ' => true ] );
} );
คุณสามารถส่งผ่านคู่คีย์/ค่าธรรมดาสำหรับเงื่อนไขไปยังวิธีการที่รวมด้วย AND เท่านั้น หากคุณต้องการคำสั่งที่ซับซ้อนมากขึ้น ให้ใช้ stmt()
แทน:
$ 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 ();
เมธอด stmt()
ส่งคืนออบเจ็กต์ DoctrineDBALQueryQueryBuilder
ซึ่งช่วยให้คุณสามารถสร้างคำสั่งขั้นสูงเพิ่มเติมได้ โปรดดูเอกสารประกอบ Doctrine Query Builder สำหรับรายละเอียดเพิ่มเติม
หากคุณต้องการใช้ค่าโดยตรงในคำสั่ง SQL (ใช้คำสั่งที่เตรียมไว้เพื่อเหตุผลด้านความปลอดภัยทุกครั้งที่เป็นไปได้!) คุณต้องเสนอราคาค่าโดยใช้เมธอด q()
:
$ db = $ this -> db ();
$ result = $ db -> stmt ()-> select ( ' * ' )-> from ( ' products ' )
-> where ( ' status = ' . $ db -> q ( $ _GET [ ' status ' ] ) )-> executeQuery ();
ในทำนองเดียวกัน หากสคีมาของคุณมีคีย์เวิร์ดที่สงวนไว้ เช่น ชื่อคอลัมน์ คุณจะต้องอ้างอิงคำพูดเหล่านั้นเช่นกันโดยใช้เมธอด qi()
:
$ db = $ this -> db ();
$ result = $ db -> stmt ()-> select ( $ db -> qi ( ' key ' ) )-> from ( ' products ' )-> executeQuery ();
Doctrine รองรับเฉพาะชุดย่อยทั่วไปของคำสั่ง SQL และไม่ใช่ความเป็นไปได้ทั้งหมดที่ผู้จำหน่ายฐานข้อมูลได้นำไปใช้ หากต้องการลบขีดจำกัดดังกล่าว Upscheme ขอเสนอวิธีการ exec()
, for()
และ query()
เพื่อดำเนินการคำสั่ง SQL แบบกำหนดเองที่ไม่รองรับโดย Doctrine DBAL
หากต้องการดำเนินการสืบค้น SQL แบบกำหนดเองให้ใช้เมธอด query()
ซึ่งส่งคืนชุดผลลัพธ์ที่คุณสามารถวนซ้ำได้:
$ sql = ' SELECT id, label, status FROM product WHERE label LIKE ? ' ;
$ result = $ this -> db ()-> query ( $ sql , [ ' test% ' ] );
foreach ( $ result -> iterateAssociative () as $ row ) {
// ...
}
สำหรับคำสั่ง SQL อื่นๆ ทั้งหมด ให้ใช้เมธอด exec()
ซึ่งจะส่งคืนจำนวนแถวที่ได้รับผลกระทบ:
$ sql = ' UPDATE product SET status=? WHERE status=? ' ;
$ num = $ this -> db ()-> exec ( $ sql , [ 1 , 0 ] );
เมื่อใช้เมธอด for()
คุณยังสามารถดำเนินการคำสั่งได้โดยขึ้นอยู่กับแพลตฟอร์มฐานข้อมูล:
$ this -> db ()-> for ( ' mysql ' , ' CREATE FULLTEXT INDEX idx_text ON product (text) ' );
การระบุแพลตฟอร์มฐานข้อมูลมีประโยชน์มากสำหรับการสร้างดัชนีชนิดพิเศษที่ไวยากรณ์แตกต่างกันระหว่างการใช้งานฐานข้อมูล
เรียกวิธีการแบบกำหนดเองหรือผ่านการเรียกวิธีที่ไม่รู้จักไปยังออบเจ็กต์ Doctrine schema
public function __call( string $ method , array $ args )
$method
ชื่อของเมธอด$args
ตัวอย่าง:
คุณสามารถลงทะเบียนวิธีการแบบกำหนดเองที่สามารถเข้าถึงคุณสมบัติคลาสของออบเจ็กต์ Upscheme DB ได้:
Aimeos Upscheme Schema DB :: macro ( ' hasFkIndexes ' , function ( $ val ) {
return $ this -> to -> hasExplicitForeignKeyIndexes ();
} );
$ db -> hasFkIndexes ();
// returns true / false
คุณสมบัติคลาสที่มีอยู่คือ:
$this->from
: สคีมาฐานข้อมูลหลักคำสอนดั้งเดิมที่แสดงถึงฐานข้อมูลปัจจุบัน
$this->to
: สคีมาฐานข้อมูลหลักคำสอนที่มีการเปลี่ยนแปลงที่เกิดขึ้นจนถึงตอนนี้
$this->conn
: การเชื่อมต่อฐานข้อมูลหลักคำสอน
$this->up
: วัตถุ Upscheme
นอกจากนี้ คุณยังสามารถเรียกใช้เมธอด Doctrine schema ใดๆ ได้โดยตรง เช่น:
$ db -> hasExplicitForeignKeyIndexes ();
ปิดการเชื่อมต่อฐานข้อมูล
public function close() : void
โทร close()
เฉพาะสำหรับวัตถุ DB schema ที่สร้างด้วย $this->db( '...', true )
มิฉะนั้น คุณจะปิดการเชื่อมต่อหลักและ DBAL จะต้องเชื่อมต่อกับเซิร์ฟเวอร์อีกครั้ง ซึ่งจะทำให้ประสิทธิภาพลดลง!
ตัวอย่าง:
$ db = $ this -> db ( ' temp ' , true );
$ db -> dropTable ( ' test ' );
$ db -> close ();
ลบระเบียนออกจากตารางที่กำหนด
public function delete( string $ table , array $ conditions = [] ) : self
$table
ชื่อของตาราง$conditions
คู่คีย์/ค่าของชื่อคอลัมน์และค่าที่จะเปรียบเทียบคำเตือน: ค่าเงื่อนไขจะถูกหลีกเลี่ยง แต่ชื่อตารางและชื่อคอลัมน์เงื่อนไขไม่ได้เป็นเช่นนั้น! ใช้เฉพาะสตริงคงที่สำหรับชื่อตารางและชื่อคอลัมน์เงื่อนไข แต่ไม่มีอินพุตภายนอก!
ตัวอย่าง:
$ db -> delete ( ' test ' , [ ' status ' => false , ' type ' => ' old ' ] );
$ db -> delete ( ' test ' );
หลายเงื่อนไขที่ส่งผ่านในพารามิเตอร์ตัวที่สองจะรวมกันด้วย "AND" หากคุณต้องการคำสั่งที่ซับซ้อนกว่านี้ ให้ใช้เมธอด stmt()
แทน
ปล่อยคอลัมน์ที่กำหนดตามชื่อหากมีอยู่
public function dropColumn( string $ table , $ name ) : self
$table
ชื่อของตารางที่มีคอลัมน์อยู่$name
ชื่อของคอลัมน์หรือคอลัมน์ตัวอย่าง:
$ db -> dropColumn ( ' test ' , ' oldcol ' );
$ db -> dropColumn ( ' test ' , [ ' oldcol ' , ' oldcol2 ' ] );
หากไม่มีคอลัมน์หรือคอลัมน์ใดคอลัมน์หนึ่ง คอลัมน์นั้นจะถูกละเว้นโดยไม่แจ้งให้ทราบ
ยกเลิกข้อจำกัดของคีย์ที่มาจากต่างประเทศ ถ้ามีอยู่
public function dropForeign( string $ table , $ name ) : self
$table
ชื่อของตารางที่มีข้อจำกัดของคีย์นอก$name
ชื่อของข้อจำกัดหรือข้อจำกัดของคีย์นอกตัวอย่าง:
$ db -> dropForeign ( ' test ' , ' fk_old ' );
$ db -> dropForeign ( ' test ' , [ ' fk_old ' , ' fk_old2 ' ] );
หากไม่มีข้อจำกัดของคีย์ต่างประเทศหรือข้อจำกัดอย่างใดอย่างหนึ่ง ก็จะถูกละเว้นโดยไม่แจ้งให้ทราบ
ปล่อยดัชนีที่กำหนดโดยชื่อของมันหากมีอยู่
public function dropIndex( string $ table , $ name ) : self
$table
ชื่อของตารางที่มีดัชนีอยู่$name
ชื่อของดัชนีหรือดัชนีตัวอย่าง:
$ db -> dropIndex ( ' test ' , ' idx_old ' );
$ db -> dropIndex ( ' test ' , [ ' idx_old ' , ' idx_old2 ' ] );
หากไม่มีดัชนีหรือดัชนีใดดัชนีหนึ่ง ดัชนีนั้นจะถูกละเว้นโดยไม่แจ้งให้ทราบ
ปล่อยลำดับที่กำหนดตามชื่อของมัน หากมีอยู่
public function dropSequence( $ name ) : self
$name
ชื่อของลำดับหรือลำดับตัวอย่าง:
$ db -> dropSequence ( ' seq_old ' );
$ db -> dropSequence ( [ ' seq_old ' , ' seq_old2 ' ] );
หากไม่มีลำดับหรือลำดับใดลำดับหนึ่ง ลำดับนั้นจะถูกละเว้นโดยไม่แจ้งให้ทราบ
วางตารางที่กำหนดตามชื่อถ้ามีอยู่
public function dropTable( $ name ) : self
$name
ชื่อของตารางหรือตารางตัวอย่าง:
$ db -> dropTable ( ' test ' );
$ db -> dropTable ( [ ' test ' , ' test2 ' ] );
หากไม่มีตารางหรือตารางใดตารางหนึ่ง ตารางนั้นจะถูกละเว้นโดยไม่แจ้งให้ทราบ
ยกเลิกมุมมองที่กำหนดตามชื่อหากมีอยู่
public function dropView( $ name ) : self
$name
ชื่อของมุมมองหรือมุมมองตัวอย่าง:
$ db -> dropView ( ' test ' );
$ db -> dropView ( [ ' test ' , ' test2 ' ] );
หากไม่มีมุมมองหรือมุมมองใดมุมมองหนึ่ง ระบบจะละเว้นอย่างเงียบๆ
ดำเนินการคำสั่ง SQL แบบกำหนดเอง
public function exec( string $ sql , array $ params = [], array $ types = [] ) : int
$sql
คำสั่ง SQL แบบกำหนดเอง$params
รายการพารามิเตอร์ตำแหน่งหรือรายการเชื่อมโยงของตัวยึดตำแหน่งและพารามิเตอร์$types
รายการประเภทข้อมูล DBAL สำหรับพารามิเตอร์ตัวยึดตำแหน่งหรือแบบเชื่อมโยงการเปลี่ยนแปลงฐานข้อมูลจะไม่ถูกนำไปใช้ทันที ดังนั้นควรเรียก up() ก่อนดำเนินการคำสั่งที่กำหนดเองเพื่อให้แน่ใจว่าตารางที่คุณต้องการใช้นั้นถูกสร้างขึ้นก่อนหน้านี้!
ตัวอย่าง:
$ sql = ' UPDATE product SET status=? WHERE status=? ' ;
$ num = $ this -> db ()-> exec ( $ sql , [ 1 , 0 ] );
ดำเนินการคำสั่ง SQL แบบกำหนดเองหากฐานข้อมูลเป็นประเภทที่กำหนด
public function for( $ type , $ sql ) : self
$type
ประเภทฐานข้อมูลที่ควรดำเนินการคำสั่ง$sql
คำสั่งหรือคำสั่ง SQL แบบกำหนดเองประเภทแพลตฟอร์มฐานข้อมูลที่ใช้ได้คือ:
การเปลี่ยนแปลงฐานข้อมูลจะไม่ถูกนำไปใช้ทันที ดังนั้นควรเรียก up()
ก่อนดำเนินการคำสั่งที่กำหนดเองเพื่อให้แน่ใจว่าตารางที่คุณต้องการใช้นั้นถูกสร้างขึ้นก่อนหน้านี้!
ตัวอย่าง:
$ 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 ' ,
] );
ตรวจสอบว่ามีคอลัมน์หรือคอลัมน์อยู่หรือไม่
public function hasColumn( string $ table , $ name ) : bool
$table
ชื่อของตารางที่มีคอลัมน์อยู่$name
ชื่อของคอลัมน์หรือคอลัมน์ตัวอย่าง:
$ db -> hasColumn ( ' test ' , ' testcol ' );
$ db -> hasColumn ( ' test ' , [ ' testcol ' , ' testcol2 ' ] );
ตรวจสอบว่ามีข้อจำกัดของคีย์ต่างประเทศหรือไม่
public function hasForeign( string $ table , $ name ) : bool
$table
ชื่อของตารางที่มีข้อจำกัดของคีย์นอก$name
ชื่อของข้อจำกัดหรือข้อจำกัดของคีย์นอกตัวอย่าง:
$ db -> hasForeign ( ' test ' , ' fk_testcol ' );
$ db -> hasForeign ( ' test ' , [ ' fk_testcol ' , ' fk_testcol2 ' ] );
ตรวจสอบว่ามีดัชนีอยู่หรือไม่
public function hasIndex( string $ table , $ name ) : bool
$table
ชื่อของตารางที่มีดัชนีอยู่$name
ชื่อของดัชนีหรือดัชนีตัวอย่าง:
$ db -> hasIndex ( ' test ' , ' idx_test_col ' );
$ db -> hasIndex ( ' test ' , [ ' idx_test_col ' , ' idx_test_col2 ' ] );
ตรวจสอบว่ามีลำดับอยู่หรือไม่
public function hasSequence( $ name ) : bool
$name
ชื่อของลำดับหรือลำดับตัวอย่าง:
$ db -> hasSequence ( ' seq_test ' );
$ db -> hasSequence ( [ ' seq_test ' , ' seq_test2 ' ] );
ตรวจสอบว่ามีตารางอยู่หรือไม่
public function hasTable( $ name ) : bool
$name
ชื่อของตารางหรือตารางตัวอย่าง:
$ db -> hasTable ( ' test ' );
$ db -> hasTable ( [ ' test ' , ' test2 ' ] );
ตรวจสอบว่ามีมุมมองอยู่หรือไม่
public function hasView( $ name ) : bool
$name
ชื่อของมุมมองหรือมุมมองตัวอย่าง:
$ db -> hasView ( ' test ' );
$ db -> hasView ( [ ' test ' , ' test2 ' ] );
แทรกบันทึกลงในตารางที่กำหนด
public function insert( string $ table , array $ data ) : self
$table
ชื่อของตาราง$data
คู่คีย์/ค่าของชื่อคอลัมน์/ค่าที่จะแทรกตัวอย่าง:
$ db -> insert ( ' test ' , [ ' label ' => ' myvalue ' , ' status ' => true ] );
ส่งกลับ ID ของแถวที่แทรกล่าสุดลงในตารางฐานข้อมูลใดๆ
public function lastId() : string
ข้อควรระวัง: สิ่งนี้ใช้ไม่ได้กับแพลตฟอร์ม Oracle เนื่องจาก Doctrine DBAL ไม่รองรับคอลัมน์ Oracle IDENTITY ในขณะนี้
ตัวอย่าง:
$ db -> lastId ();
ส่งกลับชื่อของฐานข้อมูล
public function name() : string
ตัวอย่าง:
$ db -> name ();
เสนอราคาค่า
public function q( $ value , $ type = Doctrine DBAL ParameterType:: STRING ) : string
$value
Value เพื่อใช้ในแบบสอบถาม SQL ที่ไม่ได้เตรียมไว้$type
ประเภทพารามิเตอร์ DBALตัวอย่าง:
$ result = $ db -> stmt ()-> select ( ' * ' )-> from ( ' products ' )
-> where ( ' status = ' . $ db -> q ( $ _GET [ ' status ' ] ) )-> executeQuery ();
เสนอราคาตัวระบุฐานข้อมูล
public function qi( string $ identifier ) : string
$identifier
Identifier เช่นชื่อตารางหรือคอลัมน์ตัวอย่าง:
$ result = $ db -> stmt ()-> select ( $ db -> qi ( ' key ' ) )-> from ( ' products ' )-> executeQuery ();
ดำเนินการแบบสอบถาม SQL แบบกำหนดเอง
public function query( string $ sql , array $ params = [], array $ types = [] ) : Doctrine DBAL Result
$sql
คำสั่ง SQL แบบกำหนดเอง$params
รายการพารามิเตอร์ตำแหน่งหรือรายการเชื่อมโยงของตัวยึดตำแหน่งและพารามิเตอร์$types
รายการประเภทข้อมูล DBAL สำหรับพารามิเตอร์ตัวยึดตำแหน่งหรือแบบเชื่อมโยงตัวอย่าง:
$ result = $ db -> query ( ' SELECT id, label, status FROM product WHERE label LIKE ? ' , [ ' test% ' ] );
foreach ( $ result -> iterateAssociative () as $ row ) {
// ...
}
เคล็ดลับ: ตรวจสอบวิธี DBAL สำหรับการดึงข้อมูลสำหรับข้อมูลเพิ่มเติม
เปลี่ยนชื่อคอลัมน์หรือรายการคอลัมน์
public function renameColumn( string $ table , $ from , string $ to = null ) : self
$table
ชื่อของตาราง$from
ชื่อคอลัมน์ หรืออาร์เรย์ของชื่อคอลัมน์เก่า/ใหม่$to
ชื่อคอลัมน์ใหม่จะถูกละเว้นหากพารามิเตอร์แรกเป็นอาร์เรย์ ถ้ายังไม่มีคอลัมน์ วิธีการก็จะสำเร็จแต่จะไม่มีอะไรเกิดขึ้น ไม่จำเป็นต้องเรียก up()
ข้อจำกัด
ตัวอย่าง:
// single column
$ db -> renameColumn ( ' testtable ' , ' test_col ' , ' test_column ' );
// rename several columns at once
$ db -> renameColumn ( ' testtable ' , [ ' tcol ' => ' testcol ' , ' tcol2 ' => ' testcol2 ' ] );
เปลี่ยนชื่อคอลัมน์หรือรายการคอลัมน์
public function renameIndex( string $ table , $ from , string $ to = null ) : self
$table
ชื่อของตาราง$from
Index name หรือ array ของชื่อดัชนีเก่า/ใหม่$to
ชื่อดัชนีใหม่จะถูกละเว้นหากพารามิเตอร์แรกเป็นอาร์เรย์ ถ้ายังไม่มีดัชนี วิธีการก็จะสำเร็จแต่จะไม่มีอะไรเกิดขึ้น ไม่จำเป็นต้องเรียก up()
ตัวอย่าง:
// single index
$ db -> renameIndex ( ' testtable ' , ' idxcol ' , ' idx_column ' );
// rename several indexes at once
$ db -> renameIndex ( ' testtable ' , [ ' idxcol ' => ' idx_column ' , ' idxcol2 ' => ' idx_column2 ' ] );
เปลี่ยนชื่อตารางหรือรายการตาราง
public function renameTable( $ from , string $ to = null ) : self
$from
Table name หรือ array ของชื่อตารางเก่า/ใหม่$to
ชื่อตารางใหม่จะถูกละเว้นหากพารามิเตอร์แรกเป็นอาร์เรย์ ถ้ายังไม่มีตาราง วิธีการก็จะสำเร็จแต่จะไม่มีอะไรเกิดขึ้น ไม่จำเป็นต้องเรียก up()
ตัวอย่าง:
// single table
$ db -> renameTable ( ' testtable ' , ' newtable ' );
// rename several tables at once
$ db -> renameTable ( [ ' testtable ' => ' newtable ' , ' oldtable ' => ' testtable2 ' ] );
รีโหลด Doctrine Schema จริงสำหรับฐานข้อมูลปัจจุบัน
public function reset() : self
ตัวอย่าง:
$ db -> reset ();
ส่งกลับระเบียนจากตารางที่กำหนด
public function select( string $ table , array $ conditions = null ) : array
$table
ชื่อของตาราง$conditions
คู่คีย์/ค่าของชื่อคอลัมน์และค่าที่จะเปรียบเทียบตัวอย่าง:
$ db -> select ( ' test ' , [ ' status ' => false , ' type ' => ' old ' ] );
$ db -> select ( ' test ' );
เงื่อนไขหลายข้อที่ส่งผ่านในพารามิเตอร์ตัวที่สองจะรวมกันด้วย "AND" หากคุณต้องการคำสั่งที่ซับซ้อนกว่านี้ ให้ใช้เมธอด stmt()
แทน
ส่งกลับวัตถุลำดับสำหรับชื่อที่กำหนด
public function sequence( string $ name , Closure $ fcn = null ) : Sequence
$name
ชื่อของลำดับ$fcn
ฟังก์ชันนิรนามพร้อมพารามิเตอร์ ($sequence) ที่สร้างหรืออัปเดตคำจำกัดความของลำดับ หากยังไม่มีลำดับ ก็จะถูกสร้างขึ้น หากต้องการคงการเปลี่ยนแปลงในฐานข้อมูลคุณต้องเรียก up()
ตัวอย่าง:
$ sequence = $ db -> sequence ( ' seq_test ' );
$ sequence = $ db -> sequence ( ' seq_test ' , function ( $ seq ) {
$ seq -> start ( 1000 )-> step ( 2 )-> cache ( 100 );
} )-> up ();
ส่งคืนตัวสร้างแบบสอบถามสำหรับคำสั่ง SQL ใหม่
public function stmt() : Doctrine DBAL Query QueryBuilder
ตัวอย่าง:
$ 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 ' ];
}
**ข้อควรระวัง: ** คุณต้องอ้างอิงชื่อตารางและคอลัมน์ทั้งหมดด้วยตัวเองโดยใช้วิธี $db->qi()
!
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการ Doctrine QueryBuilder ที่มีอยู่ โปรดดูที่เอกสารประกอบ Doctrine
ส่งกลับวัตถุตารางสำหรับชื่อที่กำหนด
public function table( string $ name , Closure $ fcn = null ) : Table
$name
ชื่อของตาราง$fcn
ฟังก์ชันไม่ระบุชื่อพร้อมพารามิเตอร์ ($table) ที่สร้างหรืออัปเดตคำจำกัดความของตาราง หากยังไม่มีตาราง ตารางนั้นจะถูกสร้างขึ้น หากต้องการคงการเปลี่ยนแปลงในฐานข้อมูลคุณต้องเรียก up()
ตัวอย่าง:
$ table = $ db -> table ( ' test ' );
$ table = $ db -> table ( ' test ' , function ( $ t ) {
$ t -> id ();
$ t -> string ( ' label ' );
$ t -> bool ( ' status ' );
} )-> up ();
ดำเนินการปิดที่กำหนดภายในธุรกรรม
public function transaction( Closure $ fcn ) : self
ตัวอย่าง:
$ this -> db ()-> transaction ( function ( $ db ) {
// $db- > insert ( ... )
// $db- > update ( ... )
// $db- > delete ( ... )
} );
ส่งกลับวัตถุเป็นอาร์เรย์จากฐานข้อมูล
public function toArray() : array
ตัวอย่าง:
$ this -> db ()-> toArray ();
โครงสร้างของอาร์เรย์ที่ส่งคืนคือ:
[
' 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` '
]
]
]
ส่งกลับชนิดของฐานข้อมูล
public function type() : string
ค่าที่เป็นไปได้คือ:
ตัวอย่าง:
$ type = $ db -> type ();
ใช้การเปลี่ยนแปลงกับสคีมาฐานข้อมูล
public function up() : self
ตัวอย่าง:
$ db -> up ();
อัพเดตบันทึกจากตารางที่กำหนด
public function update( string $ table , array $ data , array $ conditions = [] ) : self
$table
ชื่อของตาราง$data
คู่คีย์/ค่าของชื่อคอลัมน์/ค่าที่จะอัปเดต$conditions
คู่คีย์/ค่าของชื่อคอลัมน์และค่าที่จะเปรียบเทียบตัวอย่าง:
$ db -> update ( ' test ' , [ ' status ' => true ] );
$ db -> update ( ' test ' , [ ' status ' => true ], [ ' status ' => false , ' type ' => ' new ' ] );
หลายเงื่อนไขที่ส่งผ่านในพารามิเตอร์ตัวที่สองจะรวมกันด้วย "AND" หากคุณต้องการคำสั่งที่ซับซ้อนกว่านี้ ให้ใช้เมธอด stmt()
แทน
สร้างมุมมองด้วยชื่อที่กำหนดหากยังไม่มี
public function view( string $ name , string $ sql , $ for = null ) : self
$name
ชื่อของมุมมอง$sql
SELECT สำหรับการเติมข้อมูลในมุมมอง$for
ประเภทฐานข้อมูล SQL นี้ควรใช้สำหรับ ("mysql", "mariadb", "postgresql", "sqlite", "sqlserver", "oracle", "db2")หากยังไม่มีมุมมอง มุมมองนั้นจะถูกสร้างขึ้น มิฉะนั้นจะไม่มีอะไรเกิดขึ้น
ตัวอย่าง:
$ 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 ' );
ออบเจ็กต์โครงร่างตารางที่คุณได้รับจากการเรียก table()
ในงานการย้ายข้อมูลของคุณจะทำให้คุณสามารถเข้าถึงตารางได้อย่างเต็มที่ และคุณสามารถเพิ่ม เปลี่ยนแปลง หรือลบคอลัมน์ ดัชนี และคีย์ต่างประเทศได้ เช่น:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> id ();
$ table -> string ( ' label ' );
$ table -> col ( ' status ' , ' tinyint ' )-> default ( 0 );
} );
นอกจากวิธีการ col()
ที่สามารถเพิ่มคอลัมน์ประเภทต่างๆ ได้แล้ว ยังมีวิธีทางลัดบางวิธีสำหรับประเภทที่มีอยู่ในการใช้งานเซิร์ฟเวอร์ฐานข้อมูลทั้งหมด:
ประเภทคอลัมน์ | คำอธิบาย |
---|---|
ใหญ่โต | คอลัมน์ BIGINT ที่มีลำดับ/การเพิ่มอัตโนมัติและกำหนดคีย์หลัก |
ใหญ่ | คอลัมน์ BIGINT ที่มีช่วงตั้งแต่ −9223372036854775808 ถึง 9223372036854775807 |
ไบนารี่ | คอลัมน์ VARBINARY ที่มีขนาดสูงสุด 255 ไบต์ |
หยด | คอลัมน์ BLOB ที่มีขนาดสูงสุด 2GB |
บูล | โคลัม BOOLEAN/BIT/NUMBER นามแฝงของ "boolean" |
บูลีน | คอลัมน์ BOOLEAN/BIT/NUMBER สำหรับการตอบสนอง TRUE/FALSE ค่า 0/1 |
ถ่าน | คอลัมน์ CHAR ที่มีจำนวนอักขระคงที่ |
วันที่ | คอลัมน์ DATE ในรูปแบบวันที่ ISO ("YYYY-MM-DD) ที่ไม่มีเวลาและเขตเวลา |
วันที่และเวลา | คอลัมน์ DATETIME ในรูปแบบวันที่/เวลา ISO ("YYYY-MM-DD HH:mm:ss" ) |
ตารางวันที่และเวลา | คอลัมน์ DATETIMETZ ในรูปแบบวันที่/เวลา ISO แต่มีรูปแบบเขตเวลาที่แตกต่างกัน |
ทศนิยม | คอลัมน์ DECIMAL สำหรับข้อมูลตัวเลขที่มีความแม่นยำจุดคงที่ (สตริงใน PHP) |
ลอย | คอลัมน์ FLOAT สำหรับข้อมูลตัวเลขที่มีความแม่นยำจุดทศนิยม 8 ไบต์ |
ไกด์ | ตัวระบุที่ไม่ซ้ำกันทั่วโลกขนาด 36 ไบต์ |
รหัส | คอลัมน์ INTEGER ที่มีลำดับ/การเพิ่มอัตโนมัติและกำหนดคีย์หลัก |
ภายใน | INTEGER โคลัม นามแฝงของ "จำนวนเต็ม" |
จำนวนเต็ม | โคลัม INTEGER ที่มีช่วงตั้งแต่ −2147483648 ถึง 2147483647 |
json.json | คอลัมน์ JSON สำหรับข้อมูล JSON ที่เข้ารหัส UTF-8 |
ตัวเล็ก | โคลัม INTEGER ที่มีช่วงตั้งแต่ −32768 ถึง 32767 |
เชือก | คอลัมน์ VARCHAR ที่มีอักขระสูงสุด 255 ตัว |
ข้อความ | คอลัมน์ TEXT/CLOB ที่มีอักขระสูงสุด 2GB |
เวลา | คอลัมน์ TIME ใน 24 ชั่วโมง "HH:MM" จากที่ เช่น "05:30" หรือ "22:15" |
อุ๊ย | ตัวระบุที่ไม่ซ้ำกันทั่วโลกขนาด 36 ไบต์ นามแฝงสำหรับ "guid" |
MySQL (หรือ MariaDB ฯลฯ) รองรับบางตัวเลือกเพื่อกำหนดลักษณะของตาราง ตัวเลือก เอ็นจิ้น จะระบุเอ็นจิ้นการจัดเก็บข้อมูลที่ใช้สำหรับตาราง:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> opt ( ' engine ' , ' InnoDB ' );
} );
ทางลัด คุณยังสามารถตั้งค่าตัวเลือกเป็นคุณสมบัติได้:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> engine = ' InnoDB ' ;
} );
หากต้องการสร้างตาราง ชั่วคราว ให้ใช้:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> temporary = true ;
} );
คุณยังสามารถตั้งค่า ชุดอักขระ เริ่มต้นและ การจัดเรียง สำหรับคอลัมน์สตริงและข้อความได้:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> charset = ' utf8mb4 ' ;
$ table -> collation = ' utf8mb4_unicode_ci ' ;
} );
หมายเหตุ: PostgreSQL และ SQL Server รองรับการเทียบเคียงด้วย แต่ค่าจะต่างกัน ดังนั้นจึงไม่สามารถใช้ค่าเดียวกันสำหรับเซิร์ฟเวอร์ทุกประเภทได้ เพื่อหลีกเลี่ยงปัญหานั้น ให้ใช้เมธอดคอลัมน์ opt()
และส่งประเภทเซิร์ฟเวอร์ฐานข้อมูลเป็นพารามิเตอร์ที่สาม:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> opt ( ' charset ' , ' utf8mb4 ' , ' mysql ' );
$ table -> opt ( ' collation ' , ' utf8mb4_unicode_ci ' , ' mysql ' );
} );
ตอนนี้ ชุดอักขระ เริ่มต้นและ การจัดเรียง จะถูกตั้งค่าสำหรับเซิร์ฟเวอร์ฐานข้อมูล MySQL เท่านั้น (หรือ MariaDB และส้อมที่คล้ายกัน)
ในกรณีที่คุณต้องการทราบค่าปัจจุบันของตัวเลือกตาราง:
$ 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 ;
} );
หากต้องการตรวจสอบว่ามีตารางอยู่แล้วหรือไม่ ให้ใช้เมธอด hasTable()
ดังนี้
if ( $ this -> db ()-> hasTable ( ' users ' ) ) {
// The "users" table exists
}
คุณสามารถตรวจสอบหลายตารางพร้อมกันได้เช่นกัน:
if ( $ this -> db ()-> hasTable ( [ ' users ' , ' addresses ' ] ) ) {
// The "users" and "addresses" tables exist
}
เมธอด hasTable()
จะคืนค่า TRUE ก็ต่อเมื่อมีตารางทั้งหมดอยู่
นอกจากการสร้างและเข้าถึงตารางแล้ว เมธอด table()
จากอ็อบเจ็กต์สคีมายังสามารถใช้เพื่ออัปเดตสคีมาตารางได้อีกด้วย ยอมรับชื่อตารางและการปิดที่จะได้รับวัตถุสคีมาของตาราง
เรามาสร้างตารางชื่อ test ก่อน โดยจะมีสามคอลัมน์ดังนี้:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> id ();
$ table -> string ( ' label ' );
$ table -> col ( ' status ' , ' tinyint ' )-> default ( 0 );
} );
ตอนนี้ เราต้องการอัปเดตตารางในการโยกย้ายอื่นโดยการเพิ่มคอลัมน์ โค้ด และเปลี่ยนค่าเริ่มต้นของคอลัมน์ สถานะ ที่มีอยู่:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' );
$ table -> col ( ' status ' , ' tinyint ' )-> default ( 1 );
} );
การเปลี่ยนแปลงจะยังคงอยู่ในฐานข้อมูลทันทีที่เมธอด table()
กลับมา ดังนั้นจึงไม่จำเป็นต้องเรียก up()
ตัวเองในภายหลัง สำหรับประเภทคอลัมน์และตัวเลือกที่มี โปรดดูส่วนคอลัมน์
วัตถุฐานข้อมูลที่ส่งคืนโดย $this->db()
สามารถเปลี่ยนชื่อตารางได้เมื่อใช้เมธอด renameTable()
:
// Renames the table "users" to "accounts"
$ this -> db ()-> renameTable ( ' users ' , ' account ' );
นอกจากนี้ยังสามารถเปลี่ยนชื่อหลายตารางพร้อมกันได้หากคุณผ่านอาร์เรย์ที่เชื่อมโยงซึ่งชื่อเก่าและใหม่เป็นคู่คีย์/ค่า:
// Renames the table "users" to "accounts" and "blog" to "posts"
$ this -> db ()-> renameTable ( [ ' users ' => ' account ' , ' blog ' => ' posts ' ] );
ตารางจะถูกเปลี่ยนชื่อหากมีอยู่เท่านั้น หากไม่มีตารางอีกต่อไป จะไม่มีการรายงานข้อผิดพลาด:
$ this -> db ()-> renameTable ( ' notexist ' , ' newtable ' );
ในกรณีนั้นการเรียกเมธอดจะสำเร็จแต่จะไม่มีอะไรเกิดขึ้น
หากต้องการลบตาราง คุณควรใช้เมธอด dropTable()
จากสคีมาฐานข้อมูล:
$ this -> db ()-> dropTable ( ' users ' );
คุณยังสามารถวางหลายตารางพร้อมกันได้โดยส่งรายการเป็นอาร์เรย์:
$ this -> db ()-> dropTable ( [ ' users ' , ' addresses ' ] );
ตารางจะถูกลบออกหากมีอยู่เท่านั้น หากไม่มีตารางอีกต่อไป จะไม่มีการรายงานข้อผิดพลาด:
$ this -> db ()-> dropTable ( ' notexist ' );
ในกรณีนั้นการเรียกเมธอดจะสำเร็จแต่จะไม่มีอะไรเกิดขึ้น
เรียกวิธีการแบบกำหนดเองหรือผ่านการเรียกวิธีที่ไม่รู้จักไปยังวัตถุตารางหลักคำสอน
public function __call( string $ method , array $ args )
$method
ชื่อของเมธอด$args
ตัวอย่าง:
คุณสามารถลงทะเบียนวิธีการแบบกำหนดเองที่มีสิทธิ์เข้าถึงคุณสมบัติคลาสของวัตถุ Upscheme Table:
Aimeos Upscheme Schema Table:: macro ( ' addConstraint ' , function ( array $ columns ) {
return $ this -> to -> addUniqueConstraint ( $ columns );
} );
$ table -> addConstraint ( [ ' col1 ' , ' col2 ' ] );
คุณสมบัติคลาสที่มีอยู่คือ:
$this->table
: สคีมาตารางหลักคำสอน
$this->up
: วัตถุ Upscheme
นอกจากนี้ คุณยังสามารถเรียกใช้เมธอดตาราง Doctrine ได้โดยตรง เช่น:
$ table -> addUniqueConstraint ( [ ' col1 ' , ' col2 ' ] );
ส่งกลับค่าสำหรับตัวเลือกตารางที่กำหนด
public function __get( string $ name )
$name
ชื่อตัวเลือกตารางรายการตัวเลือกตารางที่มีคือ:
ตัวอย่าง:
$ engine = $ table -> engine ;
// same as
$ engine = $ table -> opt ( ' engine ' );
ตั้งค่าใหม่สำหรับตัวเลือกตารางที่กำหนด
public function __set( string $ name , $ value )
$name
ชื่อตัวเลือกตารางรายการตัวเลือกตารางที่มีคือ:
ตัวอย่าง:
$ table -> engine = ' InnoDB ' ;
// same as
$ table -> opt ( ' engine ' , ' InnoDB ' );
สร้างคอลัมน์ ID ใหม่ประเภท "bigint" หรือส่งคืนคอลัมน์ที่มีอยู่
public function bigid( string $ name = null ) : Column
$name
ชื่อของคอลัมน์ IDคอลัมน์ได้รับลำดับ (การเพิ่มอัตโนมัติ) และคีย์หลักที่กำหนดโดยอัตโนมัติ หากยังไม่มีคอลัมน์ คอลัมน์นั้นจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> bigid ();
$ table -> bigid ( ' uid ' );
สร้างคอลัมน์ใหม่ประเภท "bigint" หรือส่งคืนคอลัมน์ที่มีอยู่
public function bigint( string $ name ) : Column
$name
ชื่อของคอลัมน์หากยังไม่มีคอลัมน์ คอลัมน์นั้นจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> bigint ( ' testcol ' );
สร้างคอลัมน์ใหม่ประเภท "binary" หรือส่งคืนคอลัมน์ที่มีอยู่
public function binary( string $ name , int $ length = 255 ) : Column
$name
ชื่อของคอลัมน์$length
ความยาวของคอลัมน์เป็นไบต์หากยังไม่มีคอลัมน์ คอลัมน์นั้นจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> binary ( ' testcol ' );
$ table -> binary ( ' testcol ' , 32 );
สร้างคอลัมน์ใหม่ประเภท "blob" หรือส่งคืนคอลัมน์ที่มีอยู่
public function blob( string $ name , int $ length = 0x7fff ) : Column
$name
ชื่อของคอลัมน์$length
ความยาวของคอลัมน์เป็นไบต์ความยาวสูงสุดของคอลัมน์ "blob" คือ 2GB หากยังไม่มีคอลัมน์ คอลัมน์นั้นจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> blob ( ' testcol ' );
$ table -> blob ( ' testcol ' , 0x7fffffff );
สร้างคอลัมน์ใหม่ประเภท "บูลีน" หรือส่งคืนคอลัมน์ที่มีอยู่
public function bool( string $ name ) : Column
$name
ชื่อของคอลัมน์วิธีนี้เป็นนามแฝงสำหรับบูลีน () หากยังไม่มีคอลัมน์ คอลัมน์นั้นจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> bool ( ' testcol ' );
สร้างคอลัมน์ใหม่ประเภท "บูลีน" หรือส่งคืนคอลัมน์ที่มีอยู่
public function boolean( string $ name ) : Column
$name
ชื่อของคอลัมน์หากยังไม่มีคอลัมน์ คอลัมน์นั้นจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> boolean ( ' testcol ' );
สร้างคอลัมน์ใหม่ประเภท "char" ด้วยประเภทคงที่หรือส่งคืนคอลัมน์ที่มีอยู่
public function char( string $ name , int $ length ) : Column
$name
ชื่อของคอลัมน์$length
ความยาวของคอลัมน์เป็นอักขระหากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> char ( ' testcol ' , 3 );
สร้างคอลัมน์ใหม่หรือส่งคืนคอลัมน์ที่มีอยู่
public function col( string $ name , string $ type = null ) : Column
$name
ของคอลัมน์$type
ประเภทของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> col ( ' testcol ' );
$ table -> col ( ' testcol ' , ' tinyint ' );
สร้างคอลัมน์ใหม่ของประเภท "วันที่" หรือส่งคืนค์ที่มีอยู่
public function date( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> date ( ' testcol ' );
สร้างคอลัมน์ใหม่ของประเภท "dateTime" หรือส่งคืนค์ที่มีอยู่เดิม
public function datetime( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> datetime ( ' testcol ' );
สร้างคอลัมน์ใหม่ของประเภท "DateTimetz" หรือส่งคืนค์ที่มีอยู่เดิม
public function datetimetz( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> datetimetz ( ' testcol ' );
สร้างคอลัมน์ใหม่ของประเภท "ทศนิยม" หรือส่งคืนค์ที่มีอยู่เดิม
public function decimal( string $ name , int $ digits , int $ decimals = 2 ) : Column
$name
ของคอลัมน์$digits
ตัวเลขจำนวนหลักทั้งหมดรวมถึงทศนิยม$decimals
จำนวนตัวเลขหลังจากจุดทศนิยมหากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> decimal ( ' testcol ' , 10 ); // 10 digits incl . 2 decimals
$ table -> decimal ( ' testcol ' , 10 , 4 ); // 10 digits incl . 4 decimals
หยดคอลัมน์ที่กำหนดโดยชื่อหากมีอยู่
public function dropColumn( $ name ) : self
$name
ของคอลัมน์หรือคอลัมน์ หากคอลัมน์หรือหนึ่งในคอลัมน์ไม่มีอยู่มันจะถูกละเว้นอย่างเงียบ ๆ การเปลี่ยนแปลงจะไม่ถูกนำไปใช้จนกว่างานการโยกย้ายจะเสร็จสิ้นหรือ up()
เรียกว่า
ตัวอย่าง:
$ table -> dropColumn ( ' testcol ' );
$ table -> dropColumn ( [ ' testcol ' , ' testcol2 ' ] );
ลดดัชนีที่กำหนดโดยชื่อหากมีอยู่
public function dropIndex( $ name ) : self
$name
ชื่อของดัชนีหรือดัชนี หากดัชนีหรือหนึ่งในดัชนีไม่มีอยู่มันจะถูกละเว้นอย่างเงียบ ๆ การเปลี่ยนแปลงจะไม่ถูกนำไปใช้จนกว่างานการโยกย้ายจะเสร็จสิ้นหรือ up()
เรียกว่า
ตัวอย่าง:
$ table -> dropIndex ( ' idx_test_col ' );
$ table -> dropIndex ( [ ' idx_test_col ' , ' idx_test_col2 ' ] );
ลดข้อ จำกัด ของคีย์ต่างประเทศที่กำหนดโดยชื่อหากมีอยู่
public function dropForeign( $ name ) : self
$name
ของข้อ จำกัด หรือข้อ จำกัด ของคีย์ต่างประเทศ หากข้อ จำกัด ของคีย์ต่างประเทศหรือข้อ จำกัด อย่างใดอย่างหนึ่งจะไม่มีการละเว้นอย่างเงียบ ๆ การเปลี่ยนแปลงจะไม่ถูกนำไปใช้จนกว่างานการโยกย้ายจะเสร็จสิ้นหรือ up()
เรียกว่า
ตัวอย่าง:
$ table -> dropForeign ( ' fk_test_col ' );
$ table -> dropForeign ( [ ' fk_test_col ' , ' fk_test_col2 ' ] );
ลดคีย์หลักหากมีอยู่
public function dropPrimary() : self
หากคีย์หลักไม่มีอยู่มันจะถูกละเว้นอย่างเงียบ ๆ การเปลี่ยนแปลงจะไม่ถูกนำไปใช้จนกว่างานการโยกย้ายจะเสร็จสิ้นหรือ up()
เรียกว่า
ตัวอย่าง:
$ table -> dropPrimary ();
สร้างคอลัมน์ใหม่ของประเภท "ลอย" หรือส่งคืนค์ที่มีอยู่เดิม
public function float( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> float ( ' testcol ' );
สร้างคีย์ต่างประเทศใหม่หรือส่งคืนคีย์ที่มีอยู่
public function foreign( $ localcolumn , string $ foreigntable , $ foreigncolumn = ' id ' , string $ name = null ) : Foreign
$localcolumn
ชื่อของคอลัมน์หรือคอลัมน์ท้องถิ่น$foreigntable
ของตารางอ้างอิง$foreigncolumn
ชื่อของคอลัมน์หรือคอลัมน์อ้างอิง$name
ของข้อ จำกัด คีย์ต่างประเทศและดัชนีคีย์ต่างประเทศหรือ null สำหรับชื่อ autogeneratedความยาวของชื่อคีย์ต่างประเทศไม่ควรนานกว่า 30 อักขระเพื่อความเข้ากันได้สูงสุด
ตัวอย่าง:
$ table -> foreign ( ' parentid ' , ' test ' );
$ table -> foreign ( ' parentid ' , ' test ' , ' uid ' );
$ table -> foreign ( ' parentid ' , ' test ' , ' id ' , ' fk_test_pid ' );
$ table -> foreign ( [ ' parentid ' , ' siteid ' ], ' test ' , [ ' uid ' , ' siteid ' ] );
สร้างคอลัมน์ใหม่ของประเภท "guid" หรือส่งคืนค์ที่มีอยู่เดิม
public function guid( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> guid ( ' testcol ' );
ตรวจสอบว่ามีคอลัมน์หรือไม่
public function hasColumn( $ name ) : bool
$name
ของคอลัมน์หรือคอลัมน์ตัวอย่าง:
$ table -> hasColumn ( ' testcol ' );
$ table -> hasColumn ( [ ' testcol ' , ' testcol2 ' ] );
ตรวจสอบว่ามีดัชนีอยู่หรือเปล่า
public function hasIndex( $ name ) : bool
$name
ชื่อของดัชนีหรือดัชนีตัวอย่าง:
$ table -> hasIndex ( ' idx_test_col ' );
$ table -> hasIndex ( [ ' idx_test_col ' , ' idx_test_col2 ' ] );
ตรวจสอบว่ามีข้อ จำกัด ของคีย์ต่างประเทศอยู่หรือไม่
public function hasForeign( $ name ) : bool
$name
ของข้อ จำกัด หรือข้อ จำกัด ของคีย์ต่างประเทศตัวอย่าง:
$ table -> hasForeign ( ' fk_test_col ' );
$ table -> hasForeign ( [ ' fk_test_col ' , ' fk_test_col2 ' ] );
สร้างคอลัมน์ ID ใหม่ของประเภท "จำนวนเต็ม" หรือส่งคืนค์ที่มีอยู่เดิม
public function id( string $ name = null ) : Column
$name
ของคอลัมน์ IDคอลัมน์ได้รับลำดับ (autoincrement) และคีย์หลักที่กำหนดโดยอัตโนมัติ หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> id ();
$ table -> id ( ' uid ' );
สร้างดัชนีใหม่หรือแทนที่อันที่มีอยู่
public function index( $ columns , string $ name = null ) : self
$columns
ชื่อของคอลัมน์หรือคอลัมน์ที่วางไข่ดัชนี$name
INDEX NAME หรือ NULL สำหรับชื่อ Autogeneratedความยาวของชื่อดัชนีไม่ควรนานกว่า 30 อักขระเพื่อความเข้ากันได้สูงสุด
ตัวอย่าง:
$ table -> index ( ' testcol ' );
$ table -> index ( [ ' testcol ' , ' testcol2 ' ] );
$ table ->index( ' testcol ' , 'idx_test_testcol );
สร้างคอลัมน์ใหม่ของประเภท "จำนวนเต็ม" หรือส่งคืนค์ที่มีอยู่เดิม
public function int( string $ name ) : Column
$name
ของคอลัมน์วิธีนี้เป็นนามแฝงสำหรับจำนวนเต็ม () หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> int ( ' testcol ' );
สร้างคอลัมน์ใหม่ของประเภท "จำนวนเต็ม" หรือส่งคืนค์ที่มีอยู่เดิม
public function integer( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> integer ( ' testcol ' );
สร้างคอลัมน์ใหม่ของประเภท "JSON" หรือส่งคืนค์ที่มีอยู่เดิม
public function json( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> json ( ' testcol ' );
ส่งคืนชื่อของตาราง
public function name() : string
ตัวอย่าง:
$ tablename = $ table -> name ();
ตั้งค่าตัวเลือก Schema ที่กำหนดเองหรือส่งคืนค่าปัจจุบัน
public function opt( string $ name , $ value = null )
$name
ชื่อของตัวเลือก Schema ที่เกี่ยวข้องกับตาราง$value
มูลค่าของตัวเลือก Schema ที่กำหนดเองตัวเลือกสคีมาแบบกำหนดเองที่มีอยู่คือ:
ตัวอย่าง:
$ charset = $ table -> opt ( ' charset ' );
$ table -> opt ( ' charset ' , ' utf8 ' )-> opt ( ' collation ' , ' utf8_bin ' );
// Magic methods :
$ charset = $ table -> charset ;
$ table -> charset = ' binary ' ;
สร้างดัชนีหลักใหม่หรือแทนที่อันที่มีอยู่
public function primary( $ columns , string $ name = null ) : self
$columns
ชื่อของคอลัมน์หรือคอลัมน์ที่วางไข่ดัชนี$name
INDEX NAME หรือ NULL สำหรับชื่อ Autogeneratedความยาวของชื่อดัชนีไม่ควรนานกว่า 30 อักขระเพื่อความเข้ากันได้สูงสุด
ตัวอย่าง:
$ table -> primary ( ' testcol ' );
$ table -> primary ( [ ' testcol ' , ' testcol2 ' ] );
$ table -> primary ( ' testcol ' , ' pk_test_testcol ' );
เปลี่ยนชื่อคอลัมน์หรือรายการคอลัมน์
public function renameColumn( $ from , string $ to = null ) : self
$from
ชื่อคอลัมน์หรืออาร์เรย์ของชื่อคอลัมน์เก่า/ใหม่$to
ชื่อคอลัมน์ใหม่ที่ถูกละเว้นหากพารามิเตอร์แรกเป็นอาร์เรย์ตัวอย่าง:
// single column
$ table -> renameColumn ( ' test_col ' , ' test_column ' );
// rename several columns at once
$ table -> renameColumn ( [ ' tcol ' => ' testcol ' , ' tcol2 ' => ' testcol2 ' ] );
เปลี่ยนดัชนีหรือรายการดัชนี
public function renameIndex( $ from , string $ to = null ) : self
$from
ชื่อดัชนีหรืออาร์เรย์ของชื่อดัชนีเก่า/ใหม่ (หากชื่อดัชนีใหม่เป็นโมฆะมันจะถูกสร้างขึ้น)$to
ชื่อดัชนีใหม่หรือ null สำหรับชื่อ autogenerated (ละเว้นหากพารามิเตอร์แรกเป็นอาร์เรย์)ความยาวของชื่อดัชนีไม่ควรนานกว่า 30 อักขระเพื่อความเข้ากันได้สูงสุด
ตัวอย่าง:
// 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 ' ] );
สร้างคอลัมน์ใหม่ของประเภท "smallint" หรือส่งคืนค์ที่มีอยู่เดิม
public function smallint( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> smallint ( ' testcol ' );
สร้างดัชนีเชิงพื้นที่ใหม่หรือแทนที่อันที่มีอยู่
public function spatial( $ columns , string $ name = null ) : self
$columns
ชื่อของคอลัมน์หรือคอลัมน์วางไข่ดัชนี$name
INDEX NAME หรือ NULL สำหรับชื่อ Autogeneratedความยาวของชื่อดัชนีไม่ควรนานกว่า 30 อักขระเพื่อความเข้ากันได้สูงสุด
ตัวอย่าง:
$ table -> spatial ( ' testcol ' );
$ table -> spatial ( [ ' testcol ' , ' testcol2 ' ] );
$ table -> spatial ( ' testcol ' , ' idx_test_testcol ' );
สร้างคอลัมน์ใหม่ของประเภท "สตริง" หรือส่งคืนคีย์ที่มีอยู่
public function string( string $ name , int $ length = 255 ) : Column
$name
ของคอลัมน์$length
ความยาวของคอลัมน์เป็นอักขระควรใช้ประเภทนี้มากถึง 255 อักขระ สำหรับอักขระเพิ่มเติมให้ใช้ประเภท "ข้อความ" หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> string ( ' testcol ' );
$ table -> string ( ' testcol ' , 32 );
สร้างคอลัมน์ใหม่ประเภท "ข้อความ" หรือส่งคืนคีย์ที่มีอยู่
public function text( string $ name , int $ length = 0xffff ) : Column
$name
ของคอลัมน์$length
ความยาวของคอลัมน์เป็นอักขระความยาวสูงสุดของคอลัมน์ "ข้อความ" คือ 2GB หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> text ( ' testcol ' );
$ table -> text ( ' testcol ' , 0x7fffffff );
สร้างคอลัมน์ใหม่ของประเภท "เวลา" หรือส่งคืนค์ที่มีอยู่เดิม
public function time( string $ name ) : Column
$name
ของคอลัมน์หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น ข้อมูลนี้ไม่สามารถใช้งานได้เมื่อใช้ฐานข้อมูล Oracle
ตัวอย่าง:
$ table -> time ( ' testcol ' );
สร้างดัชนีที่ไม่ซ้ำกันใหม่หรือแทนที่อันที่มีอยู่
public function unique( $ columns , string $ name = null ) : self
$columns
ชื่อของคอลัมน์หรือคอลัมน์วางไข่ดัชนี$name
INDEX NAME หรือ NULL สำหรับชื่อ Autogeneratedความยาวของชื่อดัชนีไม่ควรนานกว่า 30 อักขระเพื่อความเข้ากันได้สูงสุด
ตัวอย่าง:
$ table -> unique ( ' testcol ' );
$ table -> unique ( [ ' testcol ' , ' testcol2 ' ] );
$ table -> unique ( ' testcol ' , ' unq_test_testcol ' );
สร้างคอลัมน์ใหม่ของประเภท "guid" หรือส่งคืนค์ที่มีอยู่เดิม
public function uuid( string $ name ) : Column
$name
ของคอลัมน์วิธีนี้เป็นนามแฝงสำหรับ GUID () หากคอลัมน์ยังไม่มีอยู่มันจะถูกสร้างขึ้น
ตัวอย่าง:
$ table -> uuid ( ' testcol ' );
ใช้การเปลี่ยนแปลงกับสคีมาฐานข้อมูล
public function up() : self
ตัวอย่าง:
$ table -> up ();
วัตถุคอลัมน์สคีมาที่คุณได้รับจากการโทร col()
ในงานการย้ายถิ่นของคุณช่วยให้คุณสามารถเข้าถึงคุณสมบัติคอลัมน์ทั้งหมดได้ นอกจากนี้ยังมีทางลัดสำหรับประเภทคอลัมน์ที่รองรับโดยฐานข้อมูลทั้งหมด แต่ละคอลัมน์สามารถเปลี่ยนแปลงได้ด้วยวิธีการดัดแปลงอย่างน้อยหนึ่งวิธีและคุณยังสามารถเพิ่มดัชนีลงในคอลัมน์เดียวเช่น:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> id ()-> unsigned ( true );
$ table -> string ( ' label ' )-> index ();
$ table -> col ( ' status ' , ' tinyint ' )-> default ( 0 );
} );
ตัวอย่างจะเพิ่มคอลัมน์ต่อไปนี้:
มีวิธีทางลัดสำหรับประเภทคอลัมน์ที่มีอยู่ในการใช้งานเซิร์ฟเวอร์ฐานข้อมูลทั้งหมด:
ประเภทคอลัมน์ | คำอธิบาย |
---|---|
ใหญ่โต | คอลัมน์ Bigint ที่มีลำดับ/autoincrement และคีย์หลักที่กำหนดไว้ |
Bigint | คอลัมน์ Bigint ที่มีช่วงตั้งแต่ −9223372036854775808 ถึง 9223372036854775807 |
ไบนารี่ | คอลัมน์แปรปรวนที่มีสูงสุด 255 ไบต์ |
หยด | คอลัมน์หยดที่มีมากถึง 2GB |
บูล | บูลีน/บิต/หมายเลข Colum นามแฝงสำหรับ "บูลีน" |
บูลีน | บูลีน/บิต/หมายเลข colum สำหรับการตอบสนองจริง/เท็จ 0/1 ค่า |
ถ่าน | คอลัมน์ถ่านที่มีจำนวนอักขระคงที่ |
วันที่ | คอลัมน์วันที่ในรูปแบบ iso วันที่ ("yyyy-mm-dd) โดยไม่มีเวลาและเขตเวลา |
วันที่ | คอลัมน์ DateTime ในรูปแบบวันที่/เวลา ISO ("YYYY-MM-DD HH: MM: SS") |
tablesdatetimetz | คอลัมน์ DateTimetz ในรูปแบบวันที่/เวลา iso แต่มีรูปแบบเขตเวลาที่แตกต่างกัน |
ทศนิยม | คอลัมน์ทศนิยมสำหรับข้อมูลตัวเลขที่มีความแม่นยำจุดคงที่ (สตริงใน PHP) |
ลอย | คอลัมน์ลอยสำหรับข้อมูลตัวเลขที่มีความแม่นยำแบบลอยตัว 8 ไบต์ |
ไกด์ | ตัวระบุที่ไม่ซ้ำกันทั่วโลกด้วย 36 ไบต์ |
รหัส | คอลัมน์จำนวนเต็มที่มีลำดับ/autoincrement และคีย์หลักที่กำหนดไว้ |
ภายใน | จำนวนเต็ม Colum นามแฝงสำหรับ "จำนวนเต็ม" |
จำนวนเต็ม | จำนวนเต็ม Colum ที่มีช่วงตั้งแต่ −2147483648 ถึง 2147483647 |
json.json | คอลัมน์ JSON สำหรับข้อมูล JSON ที่เข้ารหัส UTF-8 |
สิ่งเล็ก ๆ น้อย ๆ | จำนวนเต็ม Colum ที่มีช่วงตั้งแต่ −32768 ถึง 32767 |
เชือก | คอลัมน์ Varchar มีอักขระสูงสุด 255 ตัว |
ข้อความ | คอลัมน์ข้อความ/clob ที่มีอักขระ 2GB สูงสุด |
เวลา | คอลัมน์เวลาใน 24 ชั่วโมง "HH: MM" Fromat, เช่น "05:30" หรือ "22:15" |
uuid | ตัวระบุที่ไม่ซ้ำกันทั่วโลกที่มี 36 ไบต์นามแฝงสำหรับ "GUID" |
ในการเพิ่มประเภทคอลัมน์เฉพาะฐานข้อมูลให้ใช้เมธอด col()
เช่น:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> col ( ' status ' , ' tinyint ' );
} );
นอกจากนี้ยังเป็นไปได้ที่จะเปลี่ยนคำจำกัดความของคอลัมน์โดยเรียกใช้วิธีการดัดแปลงคอลัมน์อย่างน้อยหนึ่งวิธี:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> int ( ' number ' )-> null ( true )-> unsigned ( true );
} );
วิธีการแก้ไขคอลัมน์ที่มีอยู่คือ:
ตัวดัดแปลงคอลัมน์ | คำอธิบาย |
---|---|
autoincrement (จริง) | ตั้งค่าคอลัมน์จำนวนเต็มเป็นการเพิ่มอัตโนมัติ (นามแฝงสำหรับ seq() ) |
Charset ('UTF8') | ชุดอักขระที่ใช้โดยคอลัมน์ (MySQL) |
การเปรียบเทียบ ('ไบนารี') | การเปรียบเทียบคอลัมน์ (MySQL/PostgreSQL/SQLITE/SQLSERVER แต่ไม่เข้ากันได้) |
ความคิดเห็น ('ความคิดเห็น') | เพิ่มความคิดเห็นในคอลัมน์ (MySQL/PostgreSQL/Oracle/SQLServer) |
ค่าเริ่มต้น (1) | ค่าเริ่มต้นของคอลัมน์หากไม่มีการระบุค่า (ค่าเริ่มต้น: NULL ) |
แก้ไข (จริง) | หากสตริงหรือคอลัมน์ไบนารีควรมีความยาวคงที่ |
ดัชนี ('idx_col') | เพิ่มดัชนีลงในคอลัมน์ชื่อดัชนีเป็นทางเลือก |
ความยาว (32) | สูงสุด ความยาวของสตริงและคอลัมน์ไบนารี |
NULL (จริง) | อนุญาตให้ใส่ค่า null ลงในคอลัมน์ |
ความแม่นยำ (12) | สูงสุด จำนวนตัวเลขที่เก็บไว้ในคอลัมน์ทศนิยมและลอยรวม หลักทศนิยม |
หลัก ('pk_col') | เพิ่มคีย์หลักในคอลัมน์ชื่อคีย์หลักเป็นทางเลือก |
มาตราส่วน (2) | จำนวนหลักทศนิยมที่ใช้ในคอลัมน์ทศนิยมและลอยตัว |
SEQ (จริง) | ตั้งค่าคอลัมน์จำนวนเต็มเป็นการเพิ่มอัตโนมัติหากไม่มีการระบุค่า |
spatial ('idx_col') | เพิ่มดัชนีเชิงพื้นที่ (GEO) ลงในคอลัมน์ชื่อดัชนีเป็นทางเลือก |
ไม่ซ้ำกัน ('unq_col') | เพิ่มดัชนีที่ไม่ซ้ำกันในคอลัมน์ชื่อดัชนีเป็นทางเลือก |
ไม่ได้ลงนาม (จริง) | อนุญาตค่าจำนวนเต็มที่ไม่ได้ลงชื่อเท่านั้น (MySQL) |
ในการตั้งค่าตัวเลือกสคีมาแบบกำหนดเองสำหรับคอลัมน์ให้ใช้วิธี opt()
เช่น:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' )-> opt ( ' collation ' , ' utf8mb4 ' );
} );
เป็นไปได้ที่จะตั้งค่าตัวดัดแปลงคอลัมน์สำหรับการใช้งานฐานข้อมูลเฉพาะโดยผ่านประเภทฐานข้อมูลเป็นพารามิเตอร์ที่สาม:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' )-> opt ( ' collation ' , ' utf8mb4 ' , ' mysql ' );
} );
หากต้องการตรวจสอบว่ามีคอลัมน์อยู่แล้วให้ใช้วิธีการ hasColumn()
:
if ( $ this -> db ()-> hasColumn ( ' users ' , ' name ' ) ) {
// The "name" column in the "users" table exists
}
คุณสามารถตรวจสอบหลายคอลัมน์พร้อมกันได้เช่นกัน ในกรณีนั้นวิธี hasColumn()
จะส่งคืนจริงหากคอลัมน์ทั้งหมดมีอยู่:
if ( $ this -> db ()-> hasColumn ( ' users ' , [ ' name ' , ' status ' ] ) ) {
// The "name" and "status" columns in the "users" table exists
}
หากคุณมีวัตถุตารางอยู่แล้วคุณสามารถใช้ hasColumn()
ได้เช่นกัน:
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
}
นอกจากคอลัมน์แล้วคุณยังสามารถตรวจสอบได้ว่ามีการตั้งค่าตัวดัดแปลงคอลัมน์หรือไม่และค่าที่พวกเขามี:
if ( $ table -> string ( ' code ' )-> null () ) {
// The "code" columns is nullable
}
การดึงค่าตัวดัดแปลงคอลัมน์ปัจจุบันเป็นไปได้โดยใช้วิธีการเหล่านี้:
ตัวดัดแปลงคอลัมน์ | คำอธิบาย |
---|---|
autoincrement () | จริงถ้าคอลัมน์เป็นการเพิ่มขึ้นอัตโนมัติ (นามแฝงสำหรับ seq() ) |
charset () | ชุดอักขระที่ใช้ (MySQL) |
การเปรียบเทียบ () | ใช้การเปรียบเทียบ (mysql/postgreSql/sqlite/sqlserver แต่ไม่เข้ากันได้) |
ความคิดเห็น () | ความคิดเห็นที่เกี่ยวข้องกับคอลัมน์ (MySQL/PostgreSQL/Oracle/SQLServer) |
ค่าเริ่มต้น() | ค่าเริ่มต้นของคอลัมน์ |
ที่ตายตัว() | จริงถ้าคอลัมน์สตริงหรือไบนารีมีความยาวคงที่ |
ความยาว() | ความยาวสูงสุดของสตริงหรือคอลัมน์ไบนารี |
โมฆะ() | จริงถ้าอนุญาตให้ค่า NULL |
ความแม่นยำ () | จำนวนหลักสูงสุดที่เก็บไว้ในคอลัมน์ทศนิยมและคอลัมน์ลอยรวม หลักทศนิยม |
มาตราส่วน() | จำนวนหลักทศนิยมที่ใช้ในคอลัมน์ทศนิยมและลอยตัว |
seq () | จริงถ้าคอลัมน์เป็นการเพิ่มขึ้นอัตโนมัติ |
ไม่ได้ลงนาม () | จริงหากอนุญาตให้ใช้ค่าจำนวนเต็มที่ไม่ได้ลงชื่อเท่านั้น (MySQL) |
ในการตรวจสอบตัวดัดแปลงคอลัมน์ที่ไม่ได้มาตรฐานให้ใช้วิธี opt()
โดยไม่มีพารามิเตอร์ที่สอง จากนั้นมันจะส่งคืนค่าปัจจุบันของตัวดัดแปลงคอลัมน์:
if ( $ table -> string ( ' code ' )-> opt ( ' charset ' ) === ' utf8 ' ) {
// The "code" columns uses UTF - 8 charset ( MySQL only)
}
เป็นไปได้ที่จะเปลี่ยนตัวดัดแปลงคอลัมน์ส่วนใหญ่เช่นความยาวของคอลัมน์สตริง:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' )-> length ( 64 );
} );
บางวิธียังเสนอพารามิเตอร์เพิ่มเติมเพื่อตั้งค่าตัวดัดแปลงที่ใช้บ่อยที่สุดโดยตรง:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' , 64 );
} );
หากคุณต้องการเปลี่ยนตัวดัดแปลงคอลัมน์ทันทีเพราะคุณต้องการย้ายแถวหลังจากนั้นให้ใช้เมธอด up()
เพื่อคงการเปลี่ยนแปลง:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' code ' , 64 )-> null ( true )-> up ();
// modify rows from "test" table
} );
การเปลี่ยนประเภทคอลัมน์เป็นไปได้โดยใช้วิธีการใหม่สำหรับประเภทที่เหมาะสมหรือวิธี col()
:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> text ( ' code ' );
// or
$ table -> col ( ' code ' , ' text ' );
} );
โปรดทราบว่าไม่ใช่ทุกประเภทคอลัมน์ที่สามารถเปลี่ยนเป็นประเภทอื่นหรืออย่างน้อยก็ไม่ได้ไม่มีการสูญเสียข้อมูล คุณสามารถเปลี่ยนคอลัมน์จำนวนเต็มเป็นคอลัมน์ Bigint ได้โดยไม่มีปัญหา แต่อีกวิธีหนึ่งจะล้มเหลว จะเกิดขึ้นเช่นเดียวกันหากคุณต้องการเปลี่ยนคอลัมน์ Varchar (String) เป็นคอลัมน์จำนวนเต็ม
ในการเปลี่ยนชื่อคอลัมน์ให้ใช้วิธี renameColumn()
ของสคีมา DB:
// single column
$ this -> db ()-> renameColumn ( ' testtable ' , ' label ' , ' name ' );
// multiple columns
$ this -> db ()-> renameColumn ( ' testtable ' , [ ' label ' => ' name ' , ' stat ' => ' status ' ] );
หากวัตถุตารางพร้อมใช้งานแล้วคุณสามารถใช้วิธี renameColumn()
เพื่อเปลี่ยนชื่อคอลัมน์หนึ่งหรือมากกว่า:
$ this -> db ()-> table ( ' testtable ' , function ( $ table ) {
// single column
$ table -> renameColumn ( ' label ' , ' name ' );
// multiple columns
$ table -> renameColumn ( [ ' label ' => ' name ' , ' stat ' => ' status ' ] );
} );
ในทุกกรณีคอลัมน์จะถูกลบออกหากมีอยู่เท่านั้น ไม่มีการรายงานข้อผิดพลาดหากไม่มีคอลัมน์หนึ่งคอลัมน์หรือมากกว่าในตาราง
ในการวางคอลัมน์ให้ใช้วิธี dropColumn()
จากวัตถุ DB Schema:
$ this -> db ()-> dropColumn ( ' users ' , ' name ' );
คุณสามารถวางคอลัมน์หลายคอลัมน์ได้หากคุณผ่านชื่อของคอลัมน์ทั้งหมดที่คุณต้องการวางเป็นอาร์เรย์:
$ this -> db ()-> dropColumn ( ' users ' , [ ' name ' , ' status ' ] );
หากคุณมีวัตถุตารางอยู่แล้วคุณสามารถใช้ dropColumn()
ได้เช่นกัน:
// single column
$ table -> dropColumn ( ' name ' );
// multiple columns
$ table -> dropColumn ( [ ' name ' , ' status ' ] );
ในทุกกรณีคอลัมน์จะถูกลบออกหากมีอยู่เท่านั้น ไม่มีการรายงานข้อผิดพลาดหากไม่มีคอลัมน์หนึ่งคอลัมน์หรือมากกว่าในตาราง
เรียกใช้วิธีการที่กำหนดเองหรือส่งผ่านวิธีการที่ไม่รู้จักเรียกไปยังวัตถุคอลัมน์หลักคำสอน
public function __call( string $ method , array $ args )
$method
ของวิธีการ$args
เมธอดพารามิเตอร์ตัวอย่าง:
คุณสามารถลงทะเบียนวิธีการที่กำหนดเองที่สามารถเข้าถึงคุณสมบัติคลาสของวัตถุคอลัมน์ Upscheme:
Aimeos Upscheme Schema Column:: macro ( ' platform ' , function ( array $ options ) {
return $ this -> to -> setPlatformOptions ( $ options );
} );
$ column -> platform ( [ ' option ' => ' value ' ] );
คุณสมบัติคลาสที่มีอยู่คือ:
$this->db
: วัตถุ DB Upscheme
$this->table
: หลักคำสอนตารางสคีมา
$this->column
: คอลัมน์คอลัมน์หลักคำสอน
นอกจากนี้คุณสามารถเรียกใช้วิธีคอลัมน์หลักคำสอนใด ๆ โดยตรงเช่น:
$ column -> setPlatformOptions ( [ ' option ' => ' value ' ] );
ส่งคืนค่าสำหรับตัวเลือกคอลัมน์ที่กำหนด
public function __get( string $ name )
$name
คอลัมน์ชื่อตัวเลือกรายการตัวเลือกคอลัมน์ที่มีอยู่คือ:
ตัวอย่าง:
$ charset = $ column -> charset ;
// same as
$ charset = $ column -> opt ( ' charset ' );
ตั้งค่าค่าใหม่สำหรับตัวเลือกคอลัมน์ที่กำหนด
public function __set( string $ name , $ value )
$name
คอลัมน์ชื่อตัวเลือก$value
คอลัมน์ค่าตัวเลือกค่ารายการตัวเลือกคอลัมน์ที่มีอยู่คือ:
ตัวอย่าง:
$ column -> charset = ' utf8 ' ;
// same as
$ column -> opt ( ' charset ' , ' utf8 ' );
ตั้งค่าคอลัมน์เป็น autoincrement หรือส่งคืนค่าปัจจุบัน
public function autoincrement( bool $ value = null )
$value
ใหม่ AutoIncrement Flag หรือ Null เพื่อส่งคืนค่าปัจจุบัน วิธีนี้เป็นนามแฝงสำหรับวิธี seq()
ตัวอย่าง:
$ value = $ column -> autoincrement ();
$ column -> autoincrement ( true );
ตั้งค่าคอลัมน์ charset หรือส่งคืนค่าปัจจุบัน
public function charset( string $ value = null )
$value
คอลัมน์ใหม่ charset หรือ null เพื่อส่งคืนค่าปัจจุบันตัวอย่าง:
$ comment = $ column -> charset ();
$ column -> charset ( ' utf8 ' );
ตั้งค่าการเรียงคอลัมน์หรือส่งคืนค่าปัจจุบัน
public function collation( string $ value = null )
$value
การเรียงคอลัมน์ใหม่หรือ null เพื่อส่งคืนค่าปัจจุบันตัวอย่าง:
$ comment = $ column -> collation ();
$ column -> collation ( ' binary ' );
ตั้งค่าความคิดเห็นคอลัมน์หรือส่งคืนค่าปัจจุบัน
public function comment( string $ value = null )
$value
คอลัมน์ใหม่ความคิดเห็นหรือ null เพื่อส่งคืนค่ากระแสไฟฟ้าตัวอย่าง:
$ comment = $ column -> comment ();
$ column -> comment ( ' column comment ' );
ตั้งค่าค่าเริ่มต้นคอลัมน์หรือส่งคืนค่าปัจจุบัน
public function default( $ value = null )
$value
ค่าเริ่มต้นคอลัมน์ใหม่หรือ null เพื่อส่งคืนค่ากระแสไฟฟ้าตัวอย่าง:
$ value = $ column -> default ();
$ column -> default ( 0 );
ตั้งค่าคอลัมน์คงที่คอลัมน์หรือส่งคืนค่าปัจจุบัน
public function fixed( bool $ value = null )
$value
คอลัมน์ใหม่ค่าสถานะคงที่หรือ null เพื่อส่งคืนค่าปัจจุบันตัวอย่าง:
$ value = $ column -> fixed ();
$ column -> fixed ( true );
สร้างดัชนีปกติสำหรับคอลัมน์
public function index( string $ name = null ) : self
$name
ของดัชนีหรือ null เพื่อสร้างโดยอัตโนมัติตัวอย่าง:
$ column -> index ();
$ column -> index ( ' idx_col ' );
ตั้งค่าความยาวคอลัมน์หรือส่งคืนค่าปัจจุบัน
public function length( int $ value = null )
$value
ความยาวคอลัมน์ใหม่หรือ null เพื่อส่งคืนค่ากระแสไฟฟ้าตัวอย่าง:
$ value = $ column -> length ();
$ column -> length ( 32 );
ส่งคืนชื่อของคอลัมน์
public function name() : string
ตัวอย่าง:
$ name = $ column -> name ();
ตั้งค่าคอลัมน์ NULL FLAG หรือส่งคืนค่าปัจจุบัน
public function null( bool $ value = null )
$value
คอลัมน์ใหม่ NULL FLAG หรือ NULL เพื่อส่งคืนค่าปัจจุบันตัวอย่าง:
$ value = $ column -> null ();
$ column -> null ( true );
ตั้งค่าตัวเลือกคอลัมน์หรือส่งคืนค่าปัจจุบัน
public function opt( string $ option , $ value = null , $ for = null )
$option
คอลัมน์ชื่อตัวเลือก$value
ตัวเลือกคอลัมน์ใหม่ค่าหรือ null เพื่อส่งคืนค่ากระแสไฟฟ้า$for
ประเภทฐานข้อมูลประเภทตัวเลือกนี้ควรใช้สำหรับ ("MySQL", "Mariadb", "PostgreSQL", "SQLite", "SQLServer", "Oracle", "DB2"))ตัวอย่าง:
$ value = $ column -> opt ( ' length ' );
$ column -> opt ( ' length ' , 64 );
ตั้งค่าความแม่นยำของคอลัมน์หรือส่งคืนค่าปัจจุบัน
public function precision( int $ value = null )
$value
คอลัมน์ใหม่ค่าความแม่นยำหรือ null เพื่อส่งคืนค่ากระแสไฟฟ้าตัวอย่าง:
$ value = $ column -> precision ();
$ column -> precision ( 10 );
สร้างดัชนีหลักสำหรับคอลัมน์
public function primary( string $ name = null ) : self
$name
ของดัชนีหรือ null เพื่อสร้างโดยอัตโนมัติตัวอย่าง:
$ column -> primary ();
$ column -> primary ( ' pk_col ' );
ตั้งค่ามาตราส่วนคอลัมน์หรือส่งคืนค่าปัจจุบัน
public function scale( int $ value = null )
$value
ค่าสเกลคอลัมน์ใหม่หรือ null เพื่อส่งคืนค่าปัจจุบันตัวอย่าง:
$ value = $ column -> scale ();
$ column -> scale ( 3 );
ตั้งค่าคอลัมน์เป็น autoincrement หรือส่งคืนค่าปัจจุบัน
public function seq( bool $ value = null )
$value
ใหม่ AutoIncrement Flag หรือ Null เพื่อส่งคืนค่าปัจจุบันตัวอย่าง:
$ value = $ column -> seq ();
$ column -> seq ( true );
สร้างดัชนีเชิงพื้นที่สำหรับคอลัมน์
public function spatial( string $ name = null ) : self
$name
ของดัชนีหรือ null เพื่อสร้างโดยอัตโนมัติตัวอย่าง:
$ column -> spatial ();
$ column -> spatial ( ' idx_col ' );
ตั้งค่าประเภทคอลัมน์หรือส่งคืนค่าปัจจุบัน
public function type( string $ value = null )
$value
ประเภทคอลัมน์ใหม่หรือ null เพื่อส่งคืนค่าปัจจุบันตัวอย่าง:
$ value = $ column -> type ();
$ column -> type ( ' tinyint ' );
สร้างดัชนีที่ไม่ซ้ำกันสำหรับคอลัมน์
public function unique( string $ name = null ) : self
$name
ของดัชนีหรือ null เพื่อสร้างโดยอัตโนมัติตัวอย่าง:
$ column -> unique ();
$ column -> unique ( ' unq_col ' );
ตั้งค่าสถานะคอลัมน์ที่ไม่ได้ลงนามหรือส่งคืนค่าปัจจุบัน
public function unsigned( bool $ value = null )
$value
คอลัมน์ใหม่ที่ไม่ได้ลงนามธงหรือ null เพื่อส่งคืนค่ากระแสไฟฟ้าตัวอย่าง:
$ value = $ column -> unsigned ();
$ column -> unsigned ( true );
ใช้การเปลี่ยนแปลงกับสคีมาฐานข้อมูล
public function up() : self
ตัวอย่าง:
$ column -> up ();
Upscheme เสนอการสนับสนุนข้อ จำกัด ของคีย์ต่างประเทศซึ่งบังคับใช้ความสมบูรณ์ของข้อมูลระหว่างสองตาราง ตัวอย่างเช่นหากคอลัมน์ parentid
ของตาราง users_address
อ้างอิงคอลัมน์ id
ของตาราง users
จะไม่มีแถวในตาราง users_address
โดยไม่มีแถวที่ตรงกันในตาราง users
การเรียกวิธี foreign()
จะสร้างข้อ จำกัด ดังกล่าว:
$ this -> db ()-> table ( ' users ' , function ( $ table ) {
$ table -> id ();
} );
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' );
} );
หมายเหตุ: คอลัมน์ ( parentid
) จะและต้องมีประเภทข้อมูลและตัวดัดแปลงคอลัมน์เดียวกันกับคอลัมน์อ้างอิง ( id
) วิธี foreign()
ทำให้มั่นใจได้ว่าและจะสร้างดัชนีใหม่ที่มีชื่อเดียวกันกับข้อ จำกัด ของคีย์ต่างประเทศโดยอัตโนมัติ
หากคอลัมน์ ID ในตาราง users
มีชื่อแตกต่างกันให้ส่งชื่อเป็นพารามิเตอร์ที่สามไปยังวิธี foreign()
:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' , ' uid ' );
} );
ขอแนะนำให้ผ่านชื่อของข้อ จำกัด ของคีย์ต่างประเทศเป็นพารามิเตอร์ออกมาดังนั้นจึงง่ายต่อการเปลี่ยนแปลงหรือวางข้อ จำกัด ในภายหลัง:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' , ' id ' , ' fk_test_pid ' );
} );
ในกรณีที่จำเป็นต้องใช้คอลัมน์มากกว่าหนึ่งคอลัมน์เพื่อให้ได้ค่าที่ไม่ซ้ำกันโดยคีย์ต่างประเทศให้ส่งชื่อคอลัมน์เป็นอาร์เรย์:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( [ ' parentid ' , ' siteid ' ], ' users_address ' , [ ' id ' , ' siteid ' ] );
} );
ข้อ จำกัด ของคีย์ต่างประเทศสามารถดำเนินการที่แตกต่างกันได้หากคอลัมน์อ้างอิงในตารางต่างประเทศถูกลบออกจากการอัปเดต การดำเนินการมาตรฐานคือการ จำกัด การลบแถวหรืออัปเดตค่ารหัสอ้างอิง หากต้องการเปลี่ยนพฤติกรรมให้ใช้วิธีการ onDelete()
และ onUpdate()
:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' )-> onDelete ( ' SET NULL ' )-> onUpdate ( ' RESTRICT ' );
} );
มีทางลัดหากคุณต้องการตั้งค่าทั้งสองค่าเป็นค่าเดียวกัน:
$ this -> db ()-> table ( ' users_address ' , function ( $ table ) {
$ table -> foreign ( ' parentid ' , ' users ' )-> do ( ' SET NULL ' );
} );
ค่าที่เป็นไปได้สำหรับทั้งสองวิธีคือ:
การดำเนินการเริ่มต้นเมื่อการลบหรืออัปเดตแถวเป็น น้ำตก ดังนั้นค่าของคอลัมน์คีย์ต่างประเทศจะได้รับการอัปเดตเป็นค่าเดียวกับในตารางต่างประเทศ
หากต้องการตรวจสอบว่ามีคีย์ต่างประเทศอยู่แล้วให้ใช้วิธี hasForeign()
:
if ( $ this -> db ()-> hasForeign ( ' users_address ' , ' fk_usrad_parentid ' ) ) {
// The "fk_usrad_parentid" foreign key in the " users_address " table exists
}
นอกจากนี้ยังเป็นไปได้ที่จะตรวจสอบข้อ จำกัด ของคีย์ต่างประเทศหลายครั้งในครั้งเดียว จากนั้นเมธอด hasForeign()
จะส่งคืนจริงหากข้อ จำกัด ทั้งหมดมีอยู่ในตารางที่ผ่านเป็นอาร์กิวเมนต์แรก:
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
}
หากมีวัตถุตารางที่มีวิธี hasForeign()
ของตารางสามารถใช้แทน::
$ 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
}
} );
ในกรณีที่คุณต้องการค่าปัจจุบันของข้อ จำกัด ที่มีอยู่:
$ 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 ;
} );
ในการลบข้อ จำกัด ของคีย์ต่างประเทศออกจากตารางให้ใช้วิธี dropForeign()
และส่งชื่อของตารางและชื่อคีย์ต่างประเทศเป็นอาร์กิวเมนต์:
$ this -> db ()-> dropForeign ( ' users_address ' , ' fk_usrad_parentid ' );
นอกจากนี้คุณยังสามารถส่งชื่อคีย์ต่างประเทศหลายชื่อเพื่อวางในครั้งเดียว:
$ this -> db ()-> dropForeign ( ' users_address ' , [ ' fk_usrad_parentid ' , ' fk_usrad_siteid ' ] );
ภายในฟังก์ชั่นที่ไม่ระบุชื่อที่ส่งผ่านไปยังวิธี table()
คุณยังสามารถใช้วิธี 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 ' ] );
} );
เรียกวิธีการที่กำหนดเอง
public function __call( string $ method , array $ args )
$method
ของวิธีการ$args
เมธอดพารามิเตอร์ตัวอย่าง:
คุณสามารถลงทะเบียนวิธีการที่กำหนดเองที่สามารถเข้าถึงคุณสมบัติคลาสของวัตถุแปลกปลอมอัพมาสคิว:
Aimeos Upscheme Schema Foreign:: macro ( ' default ' , function () {
$ this -> opts = [ ' onDelete ' => ' SET NULL ' , ' onUpdate ' => ' SET NULL ' ];
} );
$ foreign -> default ();
คุณสมบัติคลาสที่มีอยู่คือ:
$this->dbaltable
: Schema ตารางหลักคำสอน
$this->table
: วัตถุตาราง Upscheme
$this->localcol
: ชื่อคอลัมน์โลคัลหรือชื่อ
$this->fktable
: ชื่อตารางต่างประเทศ
$this->fkcol
: ชื่อคอลัมน์ต่างประเทศหรือชื่อ
$this->name
: ชื่อคีย์ต่างประเทศ
$this->opts
: รายการตัวเลือกคีย์ต่างประเทศ (ส่วนใหญ่ "ondelete" และ "onupdate")
ส่งคืนค่าสำหรับตัวเลือกคีย์ต่างประเทศที่กำหนด
public function __get( string $ name )
$name
ตัวเลือกคีย์ต่างประเทศชื่อรายการตัวเลือกคีย์ต่างประเทศที่มีอยู่คือ:
ค่าที่เป็นไปได้สำหรับทั้งสองตัวเลือกคือ:
ตัวอย่าง:
$ value = $ foreign -> onDelete ;
// same as
$ value = $ foreign -> opt ( ' onDelete ' );
ตั้งค่าใหม่สำหรับตัวเลือกคีย์ต่างประเทศที่กำหนด
public function __set( string $ name , $ value )
$name
ตัวเลือกคีย์ต่างประเทศชื่อรายการตัวเลือกคีย์ต่างประเทศที่มีอยู่คือ:
ค่าที่เป็นไปได้สำหรับทั้งสองตัวเลือกคือ:
ตัวอย่าง:
$ foreign -> onDelete = ' SET NULL ' ;
// same as
$ foreign -> onDelete ( ' SET NULL ' );
$ foreign -> opt ( ' onDelete ' , ' SET NULL ' );
ตั้งค่าใหม่สำหรับตัวเลือกคีย์ต่างประเทศที่กำหนด
public function do( string $ action ) : self
$action
ดำเนินการการกระทำที่เป็นไปได้คือ:
ตัวอย่าง:
$ foreign -> do ( ' RESTRICT ' );
public function name()
ตัวอย่าง:
$ fkname = $ foreign -> name ();
public function onDelete( string $ value = null )
@Param String | null $value
ดำเนินการหรือ null เพื่อส่งคืนค่าปัจจุบัน
@return self | สตริง วัตถุเดียวกันสำหรับการตั้งค่าค่าปัจจุบันโดยไม่มีพารามิเตอร์
การกระทำที่มีอยู่คือ:
ตัวอย่าง:
$ 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
ดำเนินการหรือ null เพื่อส่งคืนค่าปัจจุบัน
@return self | สตริง วัตถุเดียวกันสำหรับการตั้งค่าค่าปัจจุบันโดยไม่มีพารามิเตอร์
การกระทำที่มีอยู่คือ:
ตัวอย่าง:
$ 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
ตัวอย่าง:
$ foreign -> up ();
การใช้งานฐานข้อมูลบางอย่างเสนอลำดับแทนคอลัมน์การเพิ่มขึ้นอัตโนมัติ/ตัวตนคือ Oracle และ PostgreSQL ลำดับเป็นฟังก์ชั่นที่สร้างตัวเลขที่เพิ่มขึ้นตามลำดับที่ใช้กับคอลัมน์ตารางเมื่อแทรกแถวใหม่ ในการสร้างลำดับใหม่ชื่อ SEQ_TEST ให้ใช้เมธอด sequence()
:
$ this -> db ()-> sequence ( ' seq_test ' );
หากต้องการใช้ค่าเริ่มต้นและความกว้างของขั้นตอนที่แตกต่างจาก 1
ให้เรียกใช้เมธอด start()
และ step()
:
$ this -> db ()-> sequence ( ' seq_test ' , function ( $ seq ) {
$ seq -> start ( 1000 )-> step ( 2 );
} );
หากต้องการตรวจสอบว่ามีลำดับอยู่แล้วให้ใช้วิธี hasSequence()
:
if ( $ this -> db ()-> hasSequence ( ' seq_test ' ) ) {
// The "seq_test" sequence exists
}
นอกจากนี้ยังเป็นไปได้ที่จะตรวจสอบหลายลำดับพร้อมกัน จากนั้นวิธี hasSequence()
จะกลับมาจริงหากลำดับทั้งหมดมีอยู่:
if ( $ this -> db ()-> hasSequence ( [ ' seq_id ' , ' seq_test ' ] ) ) {
// The "seq_id" and "seq_test" sequences exist
}
ในกรณีที่คุณจำเป็นต้องทราบค่าปัจจุบันของตัวเลือกตาราง:
$ 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 ;
} );
ในการลบลำดับให้ใช้วิธี dropSequence()
และส่งชื่อของลำดับเป็นอาร์กิวเมนต์:
$ this -> db ()-> dropSequence ( ' seq_id ' );
นอกจากนี้คุณยังสามารถส่งชื่อหลายลำดับเพื่อวางในครั้งเดียว:
$ this -> db ()-> dropSequence ( [ ' seq_id ' , ' seq_test ' ] );
เรียกวิธีการกำหนดเองหรือส่งผ่านวิธีการที่ไม่รู้จักเรียกไปยังวัตถุตารางหลักคำสอน
public function __call( string $ method , array $ args )
$method
ของวิธีการ$args
เมธอดพารามิเตอร์ตัวอย่าง:
คุณสามารถลงทะเบียนวิธีการที่กำหนดเองที่สามารถเข้าถึงคุณสมบัติคลาสของวัตถุลำดับ Upscheme:
Aimeos Upscheme Schema Sequence:: macro ( ' default ' , function () {
$ this -> start ( 1 )-> step ( 2 );
} );
$ sequence -> default ();
คุณสมบัติคลาสที่มีอยู่คือ:
$this->db
: วัตถุ DB Upscheme
$this->sequence
: Schema ลำดับหลักคำสอน
ส่งคืนค่าสำหรับตัวเลือกลำดับที่กำหนด
public function __get( string $ name )
$name
SEQUENCE NAMEตัวอย่าง:
$ value = $ sequence -> getInitialValue ();
// same as
$ value = $ sequence -> start ();
ตั้งค่าค่าใหม่สำหรับตัวเลือกลำดับที่กำหนด
public function __set( string $ name , $ value )
$name
SEQUENCE NAMEตัวอย่าง:
$ value = $ sequence -> setInitialValue ( 1000 );
// same as
$ value = $ sequence -> start ( 1000 );
ตั้งค่าขนาดแคชของลำดับหรือส่งคืนค่าปัจจุบัน
public function cache( int $ value = null )
$value
หมายเลขใหม่ของรหัสลำดับที่ถูกแคชโดยไคลเอนต์หรือ null เพื่อส่งคืนค่าปัจจุบันตัวอย่าง:
$ value = $ sequence -> cache ();
$ sequence -> cache ( 100 );
ส่งคืนชื่อของลำดับ
public function name()
$ name = $ sequence -> name ();
ตั้งค่าเริ่มต้นใหม่ของลำดับหรือส่งคืนค่าปัจจุบัน
public function start( int $ value = null )
$value
ค่าเริ่มต้นใหม่ของลำดับหรือ null เพื่อส่งคืนค่ากระแสไฟฟ้า $ value = $ sequence -> start ();
$ sequence -> start ( 1000 );
ตั้งค่าขนาดขั้นตอนของค่าลำดับใหม่หรือส่งคืนค่าปัจจุบัน
public function step( int $ value = null )
$value
ขนาดขั้นตอนใหม่ลำดับจะเพิ่มขึ้นหรือลดลงโดยหรือ null เพื่อส่งคืนค่าปัจจุบัน $ value = $ sequence -> step ();
$ sequence -> step ( 2 );
ใช้การเปลี่ยนแปลงกับสคีมาฐานข้อมูล
public function up() : self
$ sequence -> up ();
ดัชนีเพิ่มความเร็วในการสืบค้นฐานข้อมูลและเวลาที่ความต้องการแบบสอบถามสามารถลดลงได้จากหลายนาทีเป็นมิลลิวินาทีหากใช้อย่างถูกต้อง มีดัชนีหลายประเภท:
ดัชนีทั้งหมดอาจประกอบด้วยหนึ่งคอลัมน์ขึ้นไป แต่ลำดับของคอลัมน์มีผลกระทบอย่างมากหากใช้ดัชนีสำหรับการสืบค้นหรือไม่
ดัชนีทั้งหมดถูกผูกไว้กับตารางซึ่งมีคอลัมน์ที่ครอบคลุมดัชนี วิธีที่ง่ายที่สุดในการสร้างดัชนีผ่านคอลัมน์เดียวคือการใช้วิธี index()
ของวัตถุคอลัมน์:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' label ' )-> index ();
} );
พารามิเตอร์ที่สองของวิธี index()
ช่วยให้คุณตั้งชื่อที่กำหนดเองสำหรับดัชนี:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> string ( ' label ' )-> index ( ' idx_test_label ' );
} );
หมายเหตุ: สำหรับความเข้ากันได้สูงสุดระหว่างประเภทฐานข้อมูลที่แตกต่างกันความยาวของชื่อดัชนีควรเป็น 30 อักขระหรือน้อยกว่า
เช่นเดียวกันสำหรับดัชนีหลักไม่ซ้ำกันและเชิงพื้นที่:
$ 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 ' );
} );
สำหรับดัชนีหลายคอลัมน์วิธีการ primary()
, unique()
และ index()
มีอยู่ในวัตถุตาราง:
$ 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 ' ] );
} );
Spatial indexes can NOT span multiple columns but creating them is also possible using the spatial()
method of the table object:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> spatial ( ' location ' );
} );
To check if an index already exists, use the hasIndex()
method:
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