حزمة 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 Migrations. في حين أن Doctrine DBAL يقوم بعمل جيد في تلخيص الاختلافات بين العديد من تطبيقات قواعد البيانات، إلا أن واجهة برمجة التطبيقات (API) الخاصة به تتطلب كتابة الكثير من التعليمات البرمجية. تحتوي عمليات ترحيل العقيدة على الموقع الآخر على بعض العيوب التي تجعل من الصعب استخدامها في جميع التطبيقات التي تدعم امتدادات الطرف الثالث.
واجهة برمجة التطبيقات الخاصة بـ DBAL مطولة للغاية وتحتاج إلى كتابة الكثير من التعليمات البرمجية حتى للأشياء البسيطة. يستخدم Upscheme Doctrine DBAL لتقديم واجهة برمجة تطبيقات سهلة الاستخدام لترقية مخطط قاعدة بيانات التطبيق الخاص بك بأقل قدر من التعليمات البرمجية. بالنسبة لمثال 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 );
}
تعتمد عقيدة الهجرة على فئات الهجرة التي يتم تسميتها حسب وقت إنشائها لضمان ترتيب معين. علاوة على ذلك، فإنه يقوم بتخزين عمليات الترحيل التي تم تنفيذها في جدول قاعدة بياناتك. هناك ثلاث مشاكل رئيسية تنشأ عن ذلك:
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:
سكليتي:
$ 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
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
: مخطط قاعدة بيانات Doctrine الأصلي الذي يمثل قاعدة البيانات الحالية
$this->to
: مخطط قاعدة بيانات Doctrine الذي يحتوي على التغييرات التي تم إجراؤها حتى الآن
$this->conn
: اتصال قاعدة بيانات العقيدة
$this->up
: كائن Upscheme
علاوة على ذلك، يمكنك استدعاء أي طريقة لمخطط Doctrine مباشرةً، على سبيل المثال:
$ db -> hasExplicitForeignKeyIndexes ();
إغلاق اتصال قاعدة البيانات
public function close() : void
استدعاء close()
فقط لكائنات مخطط قاعدة البيانات التي تم إنشاؤها باستخدام $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 لمعلمات العنصر النائب الموضعية أو الترابطيةلا يتم تطبيق تغييرات قاعدة البيانات على الفور، لذا قم دائمًا باستدعاء() قبل تنفيذ البيانات المخصصة للتأكد من أن الجداول التي تريد استخدامها قد تم إنشاؤها من قبل!
أمثلة:
$ 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 ] );
إرجاع معرف الصف الأخير المدرج في أي جدول قاعدة بيانات
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
مثل اسم الجدول أو العمودأمثلة:
$ 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
Column name أو مصفوفة أسماء الأعمدة القديمة/الجديدة$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
اسم الفهرس أو مجموعة أسماء الفهرس القديمة/الجديدة$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 أو مجموعة من أسماء الجداول القديمة/الجديدة$to
تم تجاهل اسم الجدول الجديد إذا كانت المعلمة الأولى عبارة عن مصفوفة إذا لم يكن الجدول موجودًا بعد، فستنجح الطريقة ولكن لن يحدث شيء. لا يلزم الاتصال بـ up()
.
أمثلة:
// single table
$ db -> renameTable ( ' testtable ' , ' newtable ' );
// rename several tables at once
$ db -> renameTable ( [ ' testtable ' => ' newtable ' , ' oldtable ' => ' testtable2 ' ] );
يعيد تحميل مخطط Doctrine الفعلي لقاعدة البيانات الحالية
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()
التي يمكنها إضافة أعمدة من أنواع عشوائية، هناك بعض طرق الاختصار للأنواع المتاحة في جميع تطبيقات خادم قاعدة البيانات:
نوع العمود | وصف |
---|---|
com.bigid | عمود كبير مع تسلسل/زيادة تلقائية ومفتاح أساسي مخصص |
bigint | عمود كبير بنطاق من −9223372036854775808 إلى 9223372036854775807 |
ثنائي | عمود VARBINARY يصل حجمه إلى 255 بايت |
فقاعة | عمود BLOB بسعة تصل إلى 2 جيجابايت |
منطقي | عمود منطقي/BIT/NUMBER، الاسم المستعار لـ "منطقي" |
منطقية | عمود منطقي/بت/رقم لـ TRUE/FALSE. قيم 0/1 |
شار | عمود CHAR بعدد ثابت من الأحرف |
تاريخ | عمود DATE بتنسيق تاريخ ISO ("YYYY-MM-DD) بدون الوقت والمنطقة الزمنية |
التاريخ والوقت | عمود DATETIME بتنسيق التاريخ/الوقت ISO ("YYYY-MM-DD HH:mm:ss") |
tabledatetimetz | عمود DATETIMETZ بتنسيق التاريخ/الوقت ISO ولكن بتنسيق منطقة زمنية مختلفة |
عشري | عمود DECIMAL للبيانات الرقمية بدقة النقطة الثابتة (سلسلة في PHP) |
يطفو | عمود FLOAT للبيانات الرقمية بدقة فاصلة عائمة تبلغ 8 بايت |
دليل | معرف فريد عالميًا بـ 36 بايت |
بطاقة تعريف | عمود عدد صحيح مع تسلسل/زيادة تلقائية ومفتاح أساسي معين |
كثافة العمليات | عمود INTEGER، الاسم المستعار لـ "عدد صحيح" |
عدد صحيح | عمود عدد صحيح بنطاق من −2147483648 إلى 2147483647 |
json | عمود JSON لبيانات JSON المشفرة بترميز UTF-8 |
com.miniint | عمود عدد صحيح بمدى يتراوح من -32768 إلى 32767 |
خيط | عمود VARCHAR يصل إلى 255 حرفًا |
نص | عمود TEXT/CLOB بسعة تصل إلى 2 جيجابايت من الأحرف |
وقت | عمود الوقت في 24 ساعة "HH:MM" من الساعة، على سبيل المثال "05:30" أو "22:15" |
uuid | معرف فريد عالميًا يحتوي على 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 ' );
إنشاء عمود معرف جديد من النوع "كبير" أو إرجاع العمود الموجود
public function bigid( string $ name = null ) : Column
$name
اسم عمود المعرفيحصل العمود على تسلسل (زيادة تلقائية) ويتم تعيين مفتاح أساسي تلقائيًا. إذا لم يكن العمود موجودًا بعد، فسيتم إنشاؤه.
أمثلة:
$ table -> bigid ();
$ table -> bigid ( ' uid ' );
إنشاء عمود جديد من النوع "كبير" أو إرجاع العمود الموجود
public function bigint( string $ name ) : Column
$name
اسم العمودإذا لم يكن العمود موجودًا بعد، فسيتم إنشاؤه.
أمثلة:
$ table -> bigint ( ' testcol ' );
إنشاء عمود جديد من النوع "ثنائي" أو إرجاع العمود الموجود
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" هو 2 جيجابايت. إذا لم يكن العمود موجودًا بعد، فسيتم إنشاؤه.
أمثلة:
$ table -> blob ( ' testcol ' );
$ table -> blob ( ' testcol ' , 0x7fffffff );
إنشاء عمود جديد من النوع "منطقي" أو إرجاع العمود الموجود
public function bool( string $ name ) : Column
$name
اسم العمودهذه الطريقة هي اسم مستعار لـ boolean(). إذا لم يكن العمود موجودًا بعد، فسيتم إنشاؤه.
أمثلة:
$ 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 ();
ينشئ عمودًا جديدًا من النوع "Float" أو يعيد العوامل الموجودة
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 للاسم المدمج تلقائيًالا ينبغي أن يكون طول اسم المفتاح الأجنبي أطول من 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 ' ] );
ينشئ عمود معرف جديد من نوع "integer" أو إرجاع المعرف الموجود
public function id( string $ name = null ) : Column
$name
اسم المعرفيحصل العمود على تسلسل (تلقائي) ومفتاح أساسي تم تعيينه تلقائيًا. إذا لم يكن العمود موجودًا بعد ، فسيتم إنشاؤه.
أمثلة:
$ table -> id ();
$ table -> id ( ' uid ' );
يخلق فهرسًا جديدًا أو يحل محله الحالي
public function index( $ columns , string $ name = null ) : self
$columns
اسم الأعمدة أو الأعمدة التي ترفع الفهرس$name
أو NULL للاسم المدمج تلقائيًالا ينبغي أن يكون طول اسم الفهرس أطول من 30 حرفًا لتحقيق أقصى قدر من التوافق.
أمثلة:
$ table -> index ( ' testcol ' );
$ table -> index ( [ ' testcol ' , ' testcol2 ' ] );
$ table ->index( ' testcol ' , 'idx_test_testcol );
ينشئ عمودًا جديدًا من النوع "integer" أو يرجع العامل الحالي
public function int( string $ name ) : Column
$name
العمودهذه الطريقة هي الاسم المستعار لمكتمل (). إذا لم يكن العمود موجودًا بعد ، فسيتم إنشاؤه.
أمثلة:
$ table -> int ( ' testcol ' );
ينشئ عمودًا جديدًا من النوع "integer" أو يرجع العامل الحالي
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 ();
يعين خيار مخطط مخصص أو يعيد القيمة الحالية
public function opt( string $ name , $ value = null )
$name
اسم اسم مخطط المخصص المتعلق بالجدول$value
لخيار المخطط المخصصخيارات المخطط المخصصة المتاحة هي:
أمثلة:
$ 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
أو NULL للاسم المدمج تلقائيًالا ينبغي أن يكون طول اسم الفهرس أطول من 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 للاسم المتمثل في التلقائي (تم تجاهله إذا كانت المعلمة الأولى عبارة عن صفيف)لا ينبغي أن يكون طول اسم الفهارس أطول من 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
أو NULL للاسم المدمج تلقائيًالا ينبغي أن يكون طول اسم الفهرس أطول من 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
العمود بالأحرفالحد الأقصى لطول العمود "النص" هو 2 جيجابايت. إذا لم يكن العمود موجودًا بعد ، فسيتم إنشاؤه.
أمثلة:
$ 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
أو NULL للاسم المدمج تلقائيًالا ينبغي أن يكون طول اسم الفهرس أطول من 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 مع تسلسل/تلقائي ومفتاح أساسي تم تعيينه |
Bigint | عمود BIGINT مع نطاق من -922337203685475808 إلى 922337203685475807 |
ثنائي | عمود varbinary مع ما يصل إلى 255 بايت |
فقاعة | عمود Blob مع ما يصل إلى 2 جيجابايت |
منطقي | منطقية/بت/رقم colum ، الاسم المستعار لـ "Boolean" |
منطقية | منطقية/بت/رقم colum ل respres الحقيقي/الخاطئ. 0/1 القيم |
شار | عمود char مع عدد ثابت من الأحرف |
تاريخ | عمود التاريخ بتنسيق تاريخ ISO ("Yyyy-MM-DD) بدون وقت وتنسيق زمني |
DateTime | عمود DateTime بتنسيق تاريخ/الوقت ISO ("Yyyy-MM-DD HH: MM: SS") |
TableDatetimetz | عمود Datetimetz بتنسيق تاريخ/وقت ISO ولكن بتنسيق مختلف المناطق الزمنية |
عشري | عمود عشري للبيانات الرقمية مع دقة نقطة ثابتة (سلسلة في PHP) |
يطفو | عمود تعويم للبيانات الرقمية بدقة 8 بايت عائمة |
دليل | معرف فريد من نوعه مع 36 بايت |
بطاقة تعريف | عمود عدد صحيح مع تسلسل/تلقائي ومفتاح أساسي تم تعيينه |
كثافة العمليات | عدد صحيح colum ، الاسم المستعار لـ "عدد صحيح" |
عدد صحيح | عدد صحيح مع مجموعة من -2147483648 إلى 2147483647 |
json | عمود JSON لبيانات JSON المشفرة UTF-8 |
com.miniint | عدد صحيح مع مجموعة من -32768 إلى 32767 |
خيط | عمود Varchar مع ما يصل إلى 255 حرفًا |
نص | عمود النص/clob مع أحرف تصل إلى 2 جيجابايت |
وقت | عمود الوقت في 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 );
} );
طرق تعديل العمود المتاحة هي:
عمود معدّل | وصف |
---|---|
التلقائي (صحيح) | قم بتعيين أعمدة عدد صحيح على شكل تلقائي (الاسم المستعار لـ seq() ) |
charset ('UTF8') | مجموعة الأحرف المستخدمة بواسطة العمود (MySQL) |
ترتيب ('ثنائي') | ترتيب العمود (MySQL/PostgreSQL/SQLite/SQLServer ولكن غير متوافق) |
تعليق ("تعليق") | أضف تعليقًا إلى عمود (MySQL/PostgreSQL/Oracle/SQLServer) |
الافتراضي (1) | القيمة الافتراضية للعمود إذا لم يتم تحديد أي قيمة (افتراضي: NULL ) |
ثابت (صحيح) | إذا كان يجب أن يكون للسلسلة أو الأعمدة الثنائية طول ثابت |
الفهرس ('idx_col') | إضافة فهرس إلى العمود ، اسم الفهرس اختياري |
الطول (32) | الحد الأقصى. طول الأعمدة والأعمدة الثنائية |
فارغ (صحيح) | السماح بإدراج القيم الخالية في العمود |
الدقة (12) | الحد الأقصى. عدد الأرقام المخزنة في أعمدة عشرية وطفو. أرقام عشرية |
الأساسي ('pk_col') | إضافة مفتاح أساسي إلى العمود ، اسم المفتاح الأساسي اختياري |
مقياس (2) | العدد الدقيق للأرقام العشرية المستخدمة في الأعمدة العشرية والعائمة |
seq (صحيح) | قم بتعيين أعمدة عدد صحيح على أنها مثبتة تلقائية إذا لم يتم تحديد أي قيمة |
مكاني ('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) |
تقصير() | القيمة الافتراضية للعمود |
مُثَبَّت() | صحيح إذا كان للسلسلة أو العمود الثنائي طول ثابت |
طول() | الحد الأقصى لطول السلسلة أو العمود الثنائي |
باطل() | صحيح إذا تم السماح بقيم فارغة |
دقة() | الحد الأقصى لعدد الأرقام المخزنة في الأعمدة العشرية والتعويم. أرقام عشرية |
حجم() | العدد الدقيق للأرقام العشرية المستخدمة في الأعمدة العشرية والعائمة |
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 (سلسلة) إلى عمود عدد صحيح.
لإعادة تسمية الأعمدة ، استخدم طريقة 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:
$ 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
methodshes parametersأمثلة:
يمكنك تسجيل الأساليب المخصصة التي لديها إمكانية الوصول إلى خصائص الفئة لكائن عمود UpScheme:
Aimeos Upscheme Schema Column:: macro ( ' platform ' , function ( array $ options ) {
return $ this -> to -> setPlatformOptions ( $ options );
} );
$ column -> platform ( [ ' option ' => ' value ' ] );
خصائص الفصل المتاحة هي:
$this->db
: upscheme db object
$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 ' );
يعين العمود على أنه تلقائي أو يعيد القيمة الحالية
public function autoincrement( bool $ value = null )
$value
التلقائية الجديدة أو الفارغ لإرجاع القيمة الحالية هذه الطريقة هي الاسم المستعار لطريقة 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
collation or or null لإرجاع القيمة الحاليةأمثلة:
$ comment = $ column -> collation ();
$ column -> collation ( ' binary ' );
يعين تعليق العمود أو إرجاع القيمة الحالية
public function comment( string $ value = null )
$value
التعليق عمود جديد أو فارغ لإرجاع القيمة الحاليةأمثلة:
$ comment = $ column -> comment ();
$ column -> comment ( ' column comment ' );
يعين القيمة الافتراضية للعمود أو إرجاع القيمة الحالية
public function default( $ value = null )
$value
عمود جديد القيمة الافتراضية أو الفارغ لإرجاع القيمة الحاليةأمثلة:
$ value = $ column -> default ();
$ column -> default ( 0 );
يعين العلامة الثابتة للعمود أو إرجاع القيمة الحالية
public function fixed( bool $ value = null )
$value
عمود جديد ثابت أو فارغ لإرجاع القيمة الحاليةأمثلة:
$ value = $ column -> fixed ();
$ column -> fixed ( true );
يخلق فهرسًا منتظمًا للعمود
public function index( string $ name = null ) : self
$name
اسم الفهرس أو الفهرس لإنشاء تلقائيًاأمثلة:
$ column -> index ();
$ column -> index ( ' idx_col ' );
يضبط طول العمود أو يقوم بإرجاع القيمة الحالية
public function length( int $ value = null )
$value
عمود جديد أو فارغ لإرجاع القيمة الحاليةأمثلة:
$ value = $ column -> length ();
$ column -> length ( 32 );
إرجاع اسم العمود
public function name() : string
أمثلة:
$ name = $ column -> name ();
يعين العلامة الفارغة العمود أو إرجاع القيمة الحالية
public function null( bool $ value = null )
$value
عمود جديد فارغ أو فارغ لإرجاع القيمة الحاليةأمثلة:
$ value = $ column -> null ();
$ column -> null ( true );
يعين قيمة خيار العمود أو إرجاع القيمة الحالية
public function opt( string $ option , $ value = null , $ for = null )
$option
اسم خيار الخيار$value
قيمة عمود جديد أو قيمة فارغة لإرجاع القيمة الحالية$for
لنوع قاعدة البيانات يجب استخدام هذا الخيار لـ ("mysql" ، "mariadb" ، "postgresql" ، "sqlite" ، "sqlserver" ، "Oracle" ، "DB2")أمثلة:
$ value = $ column -> opt ( ' length ' );
$ column -> opt ( ' length ' , 64 );
يعين دقة العمود أو إرجاع القيمة الحالية
public function precision( int $ value = null )
$value
قيمة عمود جديد بدقة أو قيمة فارغة لإرجاع القيمة الحاليةأمثلة:
$ value = $ column -> precision ();
$ column -> precision ( 10 );
يخلق فهرسًا أساسيًا للعمود
public function primary( string $ name = null ) : self
$name
اسم الفهرس أو الفهرس لإنشاء تلقائيًاأمثلة:
$ column -> primary ();
$ column -> primary ( ' pk_col ' );
يعين مقياس العمود أو إرجاع القيمة الحالية
public function scale( int $ value = null )
$value
قيمة مقياس عمود جديد أو فارغ لإرجاع القيمة الحاليةأمثلة:
$ value = $ column -> scale ();
$ column -> scale ( 3 );
يعين العمود على أنه تلقائي أو يعيد القيمة الحالية
public function seq( bool $ value = null )
$value
التلقائية الجديدة أو الفارغ لإرجاع القيمة الحاليةأمثلة:
$ value = $ column -> seq ();
$ column -> seq ( true );
يخلق فهرس مكاني للعمود
public function spatial( string $ name = null ) : self
$name
اسم الفهرس أو الفهرس لإنشاء تلقائيًاأمثلة:
$ column -> spatial ();
$ column -> spatial ( ' idx_col ' );
يعين نوع العمود أو إرجاع القيمة الحالية
public function type( string $ value = null )
$value
الجديدة نوع العمود أو الفارغ لإرجاع القيمة الحاليةأمثلة:
$ value = $ column -> type ();
$ column -> type ( ' tinyint ' );
يخلق فهرس فريد للعمود
public function unique( string $ name = null ) : self
$name
اسم الفهرس أو الفهرس لإنشاء تلقائيًاأمثلة:
$ column -> unique ();
$ column -> unique ( ' unq_col ' );
يعين العمود العلامة غير الموقعة أو إرجاع القيمة الحالية
public function unsigned( bool $ value = null )
$value
عمود جديد غير موقّع أو فارغ لإرجاع القيمة الحاليةأمثلة:
$ 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()
ذلك وستنشئ فهرسًا جديدًا بنفس اسم قيود المفتاح الأجنبي تلقائيًا.
إذا تم تسمية عمود المعرف في جدول 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
methodshes parametersأمثلة:
يمكنك تسجيل الأساليب المخصصة التي لديها إمكانية الوصول إلى خصائص الفئة للكائن الغريب UpsCheme:
Aimeos Upscheme Schema Foreign:: macro ( ' default ' , function () {
$ this -> opts = [ ' onDelete ' => ' SET NULL ' , ' onUpdate ' => ' SET NULL ' ];
} );
$ foreign -> default ();
خصائص الفصل المتاحة هي:
$this->dbaltable
: مخطط جدول العقيدة
$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
التي تم تنفيذها أو فارغة لإرجاع القيمة الحالية
@RETURN SELLY | سلسلة نفس الكائن لتحديد القيمة ، القيمة الحالية بدون معلمة
الإجراءات المتاحة هي:
أمثلة:
$ 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
التي تم تنفيذها أو فارغة لإرجاع القيمة الحالية
@RETURN SELLY | سلسلة نفس الكائن لتحديد القيمة ، القيمة الحالية بدون معلمة
الإجراءات المتاحة هي:
أمثلة:
$ 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
methodshes parametersأمثلة:
يمكنك تسجيل الأساليب المخصصة التي يمكنها الوصول إلى خصائص الفئة لكائن تسلسل UpScheme:
Aimeos Upscheme Schema Sequence:: macro ( ' default ' , function () {
$ this -> start ( 1 )-> step ( 2 );
} );
$ sequence -> default ();
خصائص الفصل المتاحة هي:
$this->db
: upscheme db object
$this->sequence
: مخطط تسلسل العقيدة
إرجاع القيمة لخيار التسلسل المحدد
public function __get( string $ name )
$name
خيار الاسم الاسم الاسمأمثلة:
$ value = $ sequence -> getInitialValue ();
// same as
$ value = $ sequence -> start ();
يحدد القيمة الجديدة لخيار التسلسل المحدد
public function __set( string $ name , $ value )
$name
خيار الاسم الاسم الاسمأمثلة:
$ value = $ sequence -> setInitialValue ( 1000 );
// same as
$ value = $ sequence -> start ( 1000 );
يضبط الحجم المخبوق للتسلسل أو يعيد القيمة الحالية
public function cache( int $ value = null )
$value
عدد جديد من معرفات التسلسل المخبأة من قبل العميل أو الفارغ لإرجاع القيمة الحاليةأمثلة:
$ value = $ sequence -> cache ();
$ sequence -> cache ( 100 );
يعيد اسم التسلسل
public function name()
$ name = $ sequence -> name ();
يعين قيمة البدء الجديدة للتسلسل أو إرجاع القيمة الحالية
public function start( int $ value = null )
$value
قيمة بداية بداية جديدة للتسلسل أو الفارغ لإرجاع القيمة الحالية $ value = $ sequence -> start ();
$ sequence -> start ( 1000 );
يحدد حجم الخطوة لقيم التسلسل الجديدة أو إرجاع القيمة الحالية
public function step( int $ value = null )
$value
الخطوة حجم جديد يتم زيادة التسلسل أو انخفاضه بواسطة أو فارغ لإرجاع القيمة الحالية $ 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()
لكائن الجدول:
$ this -> db ()-> table ( ' test ' , function ( $ table ) {
$ table -> spatial ( ' location ' );
} );
للتحقق مما إذا كان هناك فهرس موجود بالفعل ، استخدم طريقة hasIndex()
:
if ( $ this -> db ()-> hasIndex ( ' users ' , ' idx_users_name ' ) ) {
// The "idx_users_name" index in the "users" table exists
}
يمكنك التحقق من عدة فهارس في وقت واحد أيضًا. 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