Простой в использовании пакет 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 и Doctrinemigrations. Хотя Doctrine DBAL хорошо справляется с абстрагированием различий нескольких реализаций баз данных, его API требует написания большого количества кода. Миграция Doctrine на другом сайте имеет некоторые недостатки, из-за которых ее сложно использовать во всех приложениях, поддерживающих сторонние расширения.
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 поддерживает все основные системы управления реляционными базами данных (СУБД), но с разным уровнем поддержки доступных функций:
Хорошая поддержка:
Ограниченная поддержка:
После того как вы установили пакет aimeos/upscheme
с помощью композитора, вы можете использовать класс 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
является необязательным и необходим только в качестве ярлыка для подсказки типа аргумента функции закрытия. Ваш класс также должен быть наследником класса задачи «Базовый» или реализовывать интерфейс задачи «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 ' );
Второй параметр — это уровень детализации, а none или 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
: подключение к базе данных Doctrine.
$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 ' );
Несколько условий, передаваемых во втором параметре, объединяются оператором «И». Если вам нужны более сложные операторы, используйте вместо этого метод 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 ] );
Возвращает идентификатор последней вставленной строки в любую таблицу базы данных.
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
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
Имя столбца или массив имен старых/новых столбцов$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
Имя таблицы или массив имен старых/новых таблиц$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 ' );
Несколько условий, передаваемых во втором параметре, объединяются оператором «И». Если вам нужны более сложные операторы, используйте вместо этого метод 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 ' ] );
Несколько условий, передаваемых во втором параметре, объединяются оператором «И». Если вам нужны более сложные операторы, используйте вместо этого метод 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 | Столбец BIGINT с диапазоном от −9223372036854775808 до 9223372036854775807. |
двоичный | Столбец VARBINARY длиной до 255 байт. |
капля | Столбец BLOB размером до 2 ГБ |
логическое значение | Столбец BOOLEAN/BIT/NUMBER, псевдоним для «логического значения» |
логическое значение | Столбец BOOLEAN/BIT/NUMBER для TRUE/FALSE соответственно. значения 0/1 |
голец | Столбец CHAR с фиксированным количеством символов. |
дата | Столбец ДАТА в формате даты ISO («ГГГГ-ММ-ДД») без времени и часового пояса. |
дата и время | Столбец DATETIME в формате даты и времени ISO («ГГГГ-ММ-ДД ЧЧ:мм:сс») |
таблицыдатавремяц | Столбец DATETIMETZ в формате даты и времени ISO, но с различным форматом часового пояса. |
десятичный | Столбец DECIMAL для числовых данных с точностью до фиксированной точки (строка в PHP) |
плавать | Столбец FLOAT для числовых данных с точностью до 8 байт с плавающей запятой. |
гид | Глобальный уникальный идентификатор длиной 36 байт. |
идентификатор | Столбец INTEGER с последовательностью/автоинкрементом и назначенным первичным ключом |
интервал | Столбец INTEGER, псевдоним слова «целое число» |
целое число | Столбец INTEGER с диапазоном от −2147483648 до 2147483647. |
JSON | Столбец JSON для данных JSON в кодировке UTF-8. |
smallint | Столбец INTEGER с диапазоном от −32768 до 32767. |
нить | Столбец VARCHAR длиной до 255 символов. |
текст | Столбец TEXT/CLOB длиной до 2 ГБ символов. |
время | Столбец ВРЕМЯ в 24-часовом формате «ЧЧ:ММ», например «05:30» или «22:15». |
uuid | Глобальный уникальный идентификатор длиной 36 байт, псевдоним «guid». |
MySQL (или MariaDB и т. д.) поддерживает несколько вариантов определения аспектов таблицы. Опция engine будет указывать механизм хранения, используемый для таблицы:
$ 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 ' );
В этом случае вызов метода будет успешным, но ничего не произойдет.
Вызывает пользовательские методы или передает вызовы неизвестных методов объекту таблицы Doctrine.
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
: Схема таблицы Doctrine
$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 ' );
Создает новый столбец идентификатора типа bigint или возвращает существующий.
public function bigid( string $ name = null ) : Column
$name
Имя столбца идентификатораСтолбец получает последовательность (автоинкремент) и первичный ключ, назначаемый автоматически. Если столбец еще не существует, он будет создан.
Примеры:
$ table -> bigid ();
$ table -> bigid ( ' uid ' );
Создает новый столбец типа bigint или возвращает существующий.
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 ' ] );
Создает новый столбец идентификатора типа «целое число» или возвращает существующий
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 );
Создает новый столбец типа «целое число» или возвращает существующий
public function int( string $ name ) : Column
$name
Имя столбцаЭтот метод является псевдонимом для Integer (). Если столбец еще не существует, он будет создан.
Примеры:
$ 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 ();
Устанавливает опцию пользовательской схемы или возвращает текущее значение
public function opt( string $ name , $ value = null )
$name
Имя схемы, связанной с таблицей$value
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 с диапазоном от -9223372036854775808 до 9223372036854775807 |
бинарный | Столбец Varbinary с 255 байтами |
капля | Blob Column с до 2 ГБ |
логическое значение | Boolean/Bit/Number Colum, псевдоним для "Boolean" |
логическое значение | Boolean/Bit/Number Colum для True/False Resp. 0/1 значения |
голец | Столбец с фиксированным количеством символов |
дата | Столбец даты в формате даты ISO ("yyyy-mm-dd) без времени и часового пояса |
дата и время | Столбец DateTime в формате даты/времени ISO ("yyyy-mm-dd HH: MM: SS") |
TablesdateTimetz | Столбец DateTimetz в формате даты/времени ISO, но с различным форматом часового пояса |
десятичный | Десятичный столбец для числовых данных с точностью фиксированной точки (строка в PHP) |
плавать | Столбец поплавкой для числовых данных с 8-байтовой точностью с плавающей точкой |
гидо | Глобально уникальный идентификатор с 36 байтами |
идентификатор | Целочисленный столбец с последовательности/автоинскручением и первичным ключом, назначенным |
интервал | Целое число колум, псевдоним для "целого числа" |
целое число | Целое число Colum с диапазоном от -2147483648 до 2147483647 |
JSON | Столбец JSON для DATA UTF-8, кодированных JSON |
Smallint | Целое число колум с диапазоном от -32768 до 32767 |
нить | Столбец Varchar с до 255 символов |
текст | Столбец текста/клоба с символами до 2 ГБ |
время | Время в 24 -часовом "HH: MM" Fromat, EG "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 ) |
Исправлен (правда) | Если строки или двоичные столбцы должны иметь фиксированную длину |
index ('idx_col') | Добавить индекс в столбец, Имя индекса необязательно |
длина (32) | Макс. длина строковых и двоичных столбцов |
null (true) | Разрешить нулевые значения быть вставлены в столбец |
точность (12) | Макс. Количество цифр, хранящихся в десятичных и поплавковых столбцах, вкл. Десятичные цифры |
первичный ('pk_col') | Добавить первичную клавишу в столбец, первичное имя клавиши необязательно |
Шкала (2) | Точное количество десятичных цифр, используемых в десятичных и поплавковых столбцах |
seq (true) | Установите целочисленные столбцы в качестве автоматического ввождения, если не было указано значение |
Spatial ('idx_col') | Добавить пространственный (гео) индекс в столбец, Имя индекса необязательно |
уникальный ('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()
вернет true, только если все столбцы существуют:
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) |
Collation () | Используется Collation (mysql/postgresql/sqlite/sqlserver, но не совместим) |
комментарий() | Комментарий, связанный с столбцом (mysql/postgresql/oracle/sqlserver) |
по умолчанию() | Значение по умолчанию столбца |
зафиксированный() | True, если строка или двоичный столбец имеет фиксированную длину |
длина() | Максимальная длина строки или двоичного столбца |
нулевой() | Верно, если разрешены нулевые значения |
точность() | Максимальное количество цифр, хранящихся в десятичных и поплавковых столбцах, вкл. Десятичные цифры |
шкала() | Точное количество десятичных цифр, используемых в десятичных и поплавковых столбцах |
seq () | Правда, если столбец автоматически внедряет |
unsigned () | Верно, если разрешены только беспигнированные целочисленные значения (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:
$ 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
: upscheme db объект
$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
Новый флаг автоинскручения или null, чтобы вернуть текущее значение Этот метод является псевдонимом для метода seq()
.
Примеры:
$ value = $ column -> autoincrement ();
$ column -> autoincrement ( true );
Устанавливает столбец Charset или возвращает текущее значение
public function charset( string $ value = null )
$value
new Cumbset charset или null, чтобы вернуть текущее значениеПримеры:
$ comment = $ column -> charset ();
$ column -> charset ( ' utf8 ' );
Устанавливает сопоставление столбца или возвращает текущее значение
public function collation( string $ value = null )
$value
new Collation или Null, чтобы вернуть текущее значениеПримеры:
$ comment = $ column -> collation ();
$ column -> collation ( ' binary ' );
Устанавливает комментарий столбца или возвращает текущее значение
public function comment( string $ value = null )
$value
new Comment Comment или 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
new столбец фиксированный флаг или 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 ();
Устанавливает нулевый флаг столбца или возвращает текущее значение
public function null( bool $ value = null )
$value
new Column null flag или null, чтобы вернуть текущее значениеПримеры:
$ value = $ column -> null ();
$ column -> null ( true );
Устанавливает значение опции столбца или возвращает текущее значение
public function opt( string $ option , $ value = null , $ for = null )
$option
intormance Имя параметра$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
new Column precision 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
new Значение шкалы столбцов или NULL, чтобы вернуть текущее значениеПримеры:
$ value = $ column -> scale ();
$ column -> scale ( 3 );
Устанавливает столбец в качестве автоинскручения или возвращает текущее значение
public function seq( bool $ value = null )
$value
Новый флаг автоинскручения или 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
new Type или 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
new Column unsigned flag или 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
Параметры методаПримеры:
Вы можете зарегистрировать пользовательские методы, которые имеют доступ к свойствам класса иностранного объекта 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
выполнило действие или NULL, чтобы вернуть текущее значение
@return Self | String тот же объект для настройки значения, текущего значения без параметра
Доступные действия:
Примеры:
$ 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 | String тот же объект для настройки значения, текущего значения без параметра
Доступные действия:
Примеры:
$ 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()
вернет true, только если все последовательности существуют:
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
: upscheme db объект
$this->sequence
: схема последовательности доктрины
Возвращает значение для данной опции последовательности
public function __get( string $ name )
$name
sequence Имя параметраПримеры:
$ value = $ sequence -> getInitialValue ();
// same as
$ value = $ sequence -> start ();
Устанавливает новое значение для данной опции последовательности
public function __set( string $ name , $ value )
$name
sequence Имя параметраПримеры:
$ 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()
объекта таблицы:
$ 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