From eed42fd3f83c445a85f9b0276c8e3f9381cad42e Mon Sep 17 00:00:00 2001 From: miramir Date: Sat, 16 May 2015 21:58:13 +0500 Subject: [PATCH] Ru translation db dao docs [ci skip] --- docs/guide-ru/README.md | 2 +- docs/guide-ru/db-dao.md | 636 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 637 insertions(+), 1 deletion(-) create mode 100644 docs/guide-ru/db-dao.md diff --git a/docs/guide-ru/README.md b/docs/guide-ru/README.md index 02e34b9..c2959d3 100644 --- a/docs/guide-ru/README.md +++ b/docs/guide-ru/README.md @@ -74,7 +74,7 @@ All Rights Reserved. Работа с базами данных ---------------------- -* **TBD** [Объекты доступа к данным (DAO)](db-dao.md) - Соединение с базой данных, простые запросы, транзакции и работа со схемой. +* [Объекты доступа к данным (DAO)](db-dao.md) - Соединение с базой данных, простые запросы, транзакции и работа со схемой. * **TBD** [Построитель запросов](db-query-builder.md) - Запросы к базе данных через простой слой абстракции. * **TBD** [Active Record](db-active-record.md) - Получение объектов AR, работа с ними и определение связей. * [Миграции](db-migrations.md) - Контроль версий схемы данных при работе в команде. diff --git a/docs/guide-ru/db-dao.md b/docs/guide-ru/db-dao.md new file mode 100644 index 0000000..12275e7 --- /dev/null +++ b/docs/guide-ru/db-dao.md @@ -0,0 +1,636 @@ +Объекты доступа к данным (DAO) +============================== + +Построенные поверх [PDO](http://php.net/manual/ru/book.pdo.php), Yii DAO (объекты доступа к данным) обеспечивают +объектно-ориентированный API для доступа к реляционным базам данных. Это основа для других, более продвинутых, методов +доступа к базам данных, включая [построитель запросов](db-query-builder.md) и [active record](db-active-record.md). + +При использовании Yii DAO вы в основном будете использовать чистый SQL и массивы PHP. Как результат, это самый +эффективный способ доступа к базам данных. Тем не менее, так как синтаксис SQL может отличаться для разных баз данных, +используя Yii DAO вам нужно будет приложить дополнительные усилия, чтобы сделать приложение не зависящим от конкретной +базы данных. + +Yii DAO из коробки поддерживает следующие базы данных: + +- [MySQL](http://www.mysql.com/) +- [MariaDB](https://mariadb.com/) +- [SQLite](http://sqlite.org/) +- [PostgreSQL](http://www.postgresql.org/) +- [CUBRID](http://www.cubrid.org/): версии 9.3 или выше. +- [Oracle](http://www.oracle.com/us/products/database/overview/index.html) +- [MSSQL](https://www.microsoft.com/en-us/sqlserver/default.aspx): версии 2008 или выше. + + +## Создание подключения к базе данных + +Для доступа к базе данных, вы сначала должны подключится к ней, создав экземпляр класса [[yii\db\Connection]]: + +```php +$db = new yii\db\Connection([ + 'dsn' => 'mysql:host=localhost;dbname=example', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', +]); +``` + +Так как подключение к БД часто нужно в нескольких местах, распространённой практикой является его настройка как +[компонента приложения](structure-application-components.md): + +```php +return [ + // ... + 'components' => [ + // ... + 'db' => [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=example', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + ], + ], + // ... +]; +``` + +Теперь вы можете получить доступ к подключению к БД с помощью выражения `Yii::$app->db`. + +> Подсказка: Вы можете настроить несколько компонентов подключения, если в вашем приложении используется несколько баз данных. + +При настройке подключения, вы должны обязательно указывать Имя Источника Данных (DSN) через параметр [[yii\db\Connection::dsn|dsn]]. +Формат DSN отличается для разных баз данных. По +The format of DSN varies for different databases. Дополнительное описание смотрите в [справочнике PHP](http://php.net/manual/ru/pdo.construct.php). +Ниже представлены несколько примеров: + +* MySQL, MariaDB: `mysql:host=localhost;dbname=mydatabase` +* SQLite: `sqlite:/path/to/database/file` +* PostgreSQL: `pgsql:host=localhost;port=5432;dbname=mydatabase` +* CUBRID: `cubrid:dbname=demodb;host=localhost;port=33000` +* MS SQL Server (via sqlsrv driver): `sqlsrv:Server=localhost;Database=mydatabase` +* MS SQL Server (via dblib driver): `dblib:host=localhost;dbname=mydatabase` +* MS SQL Server (via mssql driver): `mssql:host=localhost;dbname=mydatabase` +* Oracle: `oci:dbname=//localhost:1521/mydatabase` + +Заметьте, что если вы подключаетесь к базе данных через ODBC, вам необходимо указать свойство [[yii\db\Connection::driverName]], +чтобы Yii знал какой тип базы данных используется. Например: + +```php +'db' => [ + 'class' => 'yii\db\Connection', + 'driverName' => 'mysql', + 'dsn' => 'odbc:Driver={MySQL};Server=localhost;Database=test', + 'username' => 'root', + 'password' => '', +], +``` + +Кроме свойства [[yii\db\Connection::dsn|dsn]], вам необходимо указать [[yii\db\Connection::username|username]] +и [[yii\db\Connection::password|password]]. Смотрите [[yii\db\Connection]] для того, чтоб посмотреть полный список свойств. + +> Информация: При создании экземпляра соединения к БД, фактическое соединение с базой данных будет установлено только + при выполнении первого SQL запроса или при явном вызове метода [[yii\db\Connection::open()|open()]]. + +> Подсказка: Иногда может потребоваться выполнить некоторые запросы сразу после соединения с базой данных, для инициализации +> переменных окружения. Вы можете зарегистрировать обработчик для события [[yii\db\Connection::EVENT_AFTER_OPEN|afterOpen]]. +> Вы можете зарегистрировать обработчик прямо в конфигурации приложения: +> +> ```php +> 'db' => [ +> // ... +> 'on afterOpen' => function($event) { +> $event->sender->createCommand("YOUR SQL HERE")->execute(); +> } +> ] +> ``` + +## Выполнение SQL запросов + +После создания экземпляра соединения, вы можете выполнить SQL запрос, выполнив следующие шаги: + +1. Создать [[yii\db\Command]] с текстом SQL; +2. Привязать параметры (не обязательно); +3. Вызвать один из методов выполнения SQL из [[yii\db\Command]]. + +Следующий пример показывает различные способы получения данных из базы дынных: + +```php +$db = new yii\db\Connection(...); + +// возвращает набор строк. каждая строка - это ассоциативный массив с именами столбцов и значений. +// если выборка ничего не вернёт, то будет возвращён пустой массив. +$posts = $db->createCommand('SELECT * FROM post') + ->queryAll(); + +// вернёт одну строку (первую строку) +// ложь, если ничего не будет выбрано +$post = $db->createCommand('SELECT * FROM post WHERE id=1') + ->queryOne(); + +// вернёт один столбец (первый столбец) +// пустой массив, при отсутствии результата +$titles = $db->createCommand('SELECT title FROM post') + ->queryColumn(); + +// вернёт значение +// ложь, при отсутствии результата +$count = $db->createCommand('SELECT COUNT(*) FROM post') + ->queryScalar(); +``` + +> Примечание: Чтобы сохранить точность, данные извлекаются как строки, даже если тип поля в базе данных является числовым. + +> Подсказка: Если вам необходимо выполнить SQL запрос сразу после установки соединения (например, для установки +> временной зоны или кодировки), вы можете сделать это в обработчике события [[yii\db\Connection::EVENT_AFTER_OPEN]]. +> Например: +```php +return [ + // ... + 'components' => [ + // ... + 'db' => [ + 'class' => 'yii\db\Connection', + // ... + 'on afterOpen' => function($event) { + // $event->sender ссылка на соединение с базой данных + $event->sender->createCommand("SET time_zone = 'UTC'")->execute(); + } + ], + ], + // ... +]; +``` + + +### Привязка параметров + +При создании команды из SQL запроса с параметрами, вы почти всегда должны использовать привязку параметров для +предотвращения атак через SQL инъекции. Например: + +```php +$post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status') + ->bindValue(':id', $_GET['id']) + ->bindValue(':status', 1) + ->queryOne(); +``` + +В SQL запрос, вы можете встраивать один или несколько маркеров (например `:id` в примере выше). Маркеры должны быть +строкой начинающейся с двоеточия. Далее вам нужно вызвать один из следующих методов для привязки значений к параметрам: + +* [[yii\db\Command::bindValue()|bindValue()]]: привязка одного параметра по значению +* [[yii\db\Command::bindValues()|bindValues()]]: привязка нескольких параметров в одном вызове +* [[yii\db\Command::bindParam()|bindParam()]]: похоже на [[yii\db\Command::bindValue()|bindValue()]] но привязка + происходит по ссылке. + +Следующий пример показывает альтернативный путь привязки параметров: + +```php +$params = [':id' => $_GET['id'], ':status' => 1]; + +$post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status') + ->bindValues($params) + ->queryOne(); + +$post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', $params) + ->queryOne(); +``` + +Привязка переменных реализована через [подготавливаемые запросы](http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php). +Помимо предотвращения атак путём SQL инъекций, это увеличивает производительность, так как запрос подготавливается +один раз, а потом выполняется много раз с разными параметрами. Например: + +```php +$command = $db->createCommand('SELECT * FROM post WHERE id=:id'); + +$post1 = $command->bindValue(':id', 1)->queryOne(); +$post2 = $command->bindValue(':id', 2)->queryOne(); +``` + +Так как [[yii\db\Command::bindParam()|bindParam()]] поддерживает привязку параметров по ссылке, следующий код может +быть написан следующим образом: + +```php +$command = $db->createCommand('SELECT * FROM post WHERE id=:id') + ->bindParam(':id', $id); + +$id = 1; +$post1 = $command->queryOne(); + +$id = 2; +$post2 = $command->queryOne(); +``` + +Обратите внимание что вы связываете маркер `$id` с переменной перед выполнением запроса, и затем меняете это значение +перед каждым последующим выполнением (часто это делается в цикле). Выполнении запросов таким образом может быть значительно +более эффективным, чем выполнение запроса для каждого значения параметра. + +### Выполнение Не-SELECT запросов + +В методах `queryXyz()`, описанных в предыдущих разделах, вызываются SELECT запросы для извлечения данных из базы. +Для запросов не возвращающих данные, вы должны использовать метод [[yii\db\Command::execute()]]. Например: + +```php +$db->createCommand('UPDATE post SET status=1 WHERE id=1') + ->execute(); +``` + +Метод [[yii\db\Command::execute()]] возвращает количество строк обработанных SQL запросом. + +Для запросов INSERT, UPDATE и DELETE, вместо написания чистого SQL, вы можете вызвать методы [[yii\db\Command::insert()|insert()]], +[[yii\db\Command::update()|update()]], [[yii\db\Command::delete()|delete()]], соответственно, для создания указанных +SQL конструкций. Например: + +```php +// INSERT (table name, column values) +$db->createCommand()->insert('user', [ + 'name' => 'Sam', + 'age' => 30, +])->execute(); + +// UPDATE (table name, column values, condition) +$db->createCommand()->update('user', ['status' => 1], 'age > 30')->execute(); + +// DELETE (table name, condition) +$db->createCommand()->delete('user', 'status = 0')->execute(); +``` + +Вы можете также вызвать [[yii\db\Command::batchInsert()|batchInsert()]] для вставки множества строк за один вызов. +Это более эффективно чем вставлять записи по одной за раз: + +```php +// table name, column names, column values +$db->createCommand()->batchInsert('user', ['name', 'age'], [ + ['Tom', 30], + ['Jane', 20], + ['Linda', 25], +])->execute(); +``` + + +## Экранирование имён таблиц и столбцов + +При написании независимого от базы данных кода, правильно экранировать имена таблиц и столбцов довольно трудно, так как +в разных базах данных правила экранирования разные. Чтоб преодолеть данную проблему вы можете использовать следующий +синтаксис экранирования используемый в Yii: + +* `[[column name]]`: заключайте имя столбца в двойные квадратные скобки; +* `{{table name}}`: заключайте имя таблицы в двойные фигурные скобки. + +Yii DAO будет автоматический преобразовывать подобные конструкции в SQL в правильно экранированные имена таблиц и столбцов. +Например, + +```php +// executes this SQL for MySQL: SELECT COUNT(`id`) FROM `employee` +$count = $db->createCommand("SELECT COUNT([[id]]) FROM {{employee}}") + ->queryScalar(); +``` + + +### Использование префиксов таблиц + +Если большинство ваших таблиц использует общий префикс в имени, вы можете использовать свойство Yii DAO для указания префикса. + +Сначала, укажите префикс таблиц через свойство [[yii\db\Connection::tablePrefix]]: + +```php +return [ + // ... + 'components' => [ + // ... + 'db' => [ + // ... + 'tablePrefix' => 'tbl_', + ], + ], +]; +``` + +Затем в коде, когда вам нужно ссылаться на таблицу, имя которой содержит такой префикс, используйте синтаксис `{{%table name}}`. +Символ процента будет автоматический заменён на префикс таблицы, который вы указали во время конфигурации соединения с +базой данных. Например: + +```php +// для MySQL будет выполнен следующий SQL: SELECT COUNT(`id`) FROM `tbl_employee` +$count = $db->createCommand("SELECT COUNT([[id]]) FROM {{%employee}}") + ->queryScalar(); +``` + + +## Исполнение транзакций + +Когда вы выполняете несколько зависимых запросов последовательно, вам может потребоваться обернуть их в транзакцию +для обеспечения целостности вашей базы данных. Если в любом из запросов произойдёт ошибка, база данных откатится на +состояние, которое было до выполнения запросов. + +Следующий код показывает типичное использование транзакций: + +```php +$db->transaction(function($db) { + $db->createCommand($sql1)->execute(); + $db->createCommand($sql2)->execute(); + // ... executing other SQL statements ... +}); +``` + +Код выше эквивалентен следующему: + +```php +$transaction = $db->beginTransaction(); + +try { + $db->createCommand($sql1)->execute(); + $db->createCommand($sql2)->execute(); + // ... executing other SQL statements ... + + $transaction->commit(); + +} catch(\Exception $e) { + + $transaction->rollBack(); + + throw $e; +} +``` + +При вызове метода [[yii\db\Connection::beginTransaction()|beginTransaction()]], будет запущена новая транзакция. +Транзакция представлена объектом [[yii\db\Transaction]] сохранённым в переменной `$transaction`. Потом, запросы будут +выполняться в блоке `try...catch...`. Если запросы будут выполнены удачно, будет выполнен метод [[yii\db\Transaction::commit()|commit()]]. +Иначе, будет вызвано исключение, и будет вызван метод [[yii\db\Transaction::rollBack()|rollBack()]] для отката +изменений сделанных до неудачно выполненного запроса внутри транзакции. + +### Указание уровня изоляции + +Yii поддерживает настройку [уровня изоляции] для ваших транзакций. По умолчанию, при старте транзакции, будет использован +уровень изоляции настроенный в вашей базе данных. Вы можете переопределить уровень изоляции по умолчанию, как +указано ниже: + +```php +$isolationLevel = \yii\db\Transaction::REPEATABLE_READ; + +$db->transaction(function ($db) { + .... +}, $isolationLevel); + +// or alternatively + +$transaction = $db->beginTransaction($isolationLevel); +``` + +Yii предоставляет четыре константы для наиболее распространённых уровней изоляции: + +- [[\yii\db\Transaction::READ_UNCOMMITTED]] - низший уровень, «Грязное» чтение, неповторяющееся чтение и фантомное чтение. +- [[\yii\db\Transaction::READ_COMMITTED]] - предотвращает «Грязное» чтение. +- [[\yii\db\Transaction::REPEATABLE_READ]] - предотвращает «Грязное» чтение и неповторяющееся чтение. +- [[\yii\db\Transaction::SERIALIZABLE]] - высший уровень, предотвращает все вышеуказанные проблемы. + +Помимо использования приведённых выше констант для задания уровня изоляции, вы можете также использовать строки с +поддерживаемые вашим СУБД. Например, в PostgreSQL, вы можете использовать `SERIALIZABLE READ ONLY DEFERRABLE`. + +Заметьте что некоторые СУБД допускают настраивать уровень изоляции только для всего соединения. Следующие транзакции +будут получать тот же уровень изоляции, даже если вы его не укажете. При использовании этой функции может потребоваться +установить уровень изоляции для всех транзакции, чтоб избежать явно конфликтующих настроек. +На момент написания этой статьи страдали от этого только MSSQL и SQLite. + +> Примечание: SQLite поддерживает только два уровня изоляции, таким образом вы можете использовать только +`READ UNCOMMITTED` и `SERIALIZABLE`. Использование других уровней изоляции приведёт к генерации исключения. + +> Примечание: PostgreSQL не допускает установки уровня изоляции до старта транзакции, так что вы не сможете установить +уровень изоляции прямо при старте транзакции. Вы можете использовать [[yii\db\Transaction::setIsolationLevel()]] в +таком случае после старта транзакции. + +[Уровни изоляции]: https://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%BE%D0%B2%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BE%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B9 + + +### Вложенные транзакции + +Если ваша СУБД поддерживает Savepoint, вы можете вкладывать транзакции как показано ниже: + +```php +$db->transaction(function ($db) { + // outer transaction + + $db->transaction(function ($db) { + // inner transaction + }); +}); +``` + +Или так, + +```php +$outerTransaction = $db->beginTransaction(); +try { + $db->createCommand($sql1)->execute(); + + $innerTransaction = $db->beginTransaction(); + try { + $db->createCommand($sql2)->execute(); + $innerTransaction->commit(); + } catch (Exception $e) { + $innerTransaction->rollBack(); + } + + $outerTransaction->commit(); +} catch (Exception $e) { + $outerTransaction->rollBack(); +} +``` + + +## Репликация и разделение запросов на чтение и запись + +Многие СУБД поддерживают [репликацию баз данных](http://en.wikipedia.org/wiki/Replication_(computing)#Database_replication) +для лучшей доступности базы данных и уменьшения времени ответа сервера. С репликацией базы данных, данные копируются +из *master servers* на *slave servers*. Все вставки и обновления должны происходить на основном сервере, хотя чтение +может производится и с подчинённых серверов. + +Чтоб воспользоваться преимуществами репликации и достичь разделения чтения и записи, вам необходимо настроить компонент +[[yii\db\Connection]] как указано ниже: + +```php +[ + 'class' => 'yii\db\Connection', + + // настройки для мастера + 'dsn' => 'dsn for master server', + 'username' => 'master', + 'password' => '', + + // общие настройки для подчинённых + 'slaveConfig' => [ + 'username' => 'slave', + 'password' => '', + 'attributes' => [ + // используем небольшой таймаут для соединения + PDO::ATTR_TIMEOUT => 10, + ], + ], + + // список настроек для подчинённых серверов + 'slaves' => [ + ['dsn' => 'dsn for slave server 1'], + ['dsn' => 'dsn for slave server 2'], + ['dsn' => 'dsn for slave server 3'], + ['dsn' => 'dsn for slave server 4'], + ], +] +``` + +Вышеуказанная конфигурация определяет систему с одним мастером и несколькими подчинёнными. Один из подчинённых +будет подключен и использован для чтения, в то время как мастер будет использоваться для запросов записи. +Такое разделение чтения и записи будет осуществлено автоматический с указанной конфигурацией. Например: + +```php +// создание экземпляра соединения, использующего вышеуказанную конфигурацию +$db = Yii::createObject($config); + +// запрос к одному из подчинённых +$rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll(); + +// запрос к мастеру +$db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute(); +``` + +> Информация: Запросы выполненные через [[yii\db\Command::execute()]] определяются как запросы на запись, а все + остальные запросы через один из "query" методов [[yii\db\Command]] воспринимаются как запросы на чтение. + Вы можете получить текущий статус соединения к подчинённому серверу через `$db->slave`. + +Компонент `Connection` поддерживает балансировку нагрузки и переключение при сбое для подчинённых серверов. +При выполнении первого запроса на чтение, компонент `Connection` будет рандомным образом выбирать подчинённый сервер +и попытается подключиться к нему. Если сервер окажется "мёртвым", он попробует подключиться к другому. Если ни один +из подчинённых серверов не будет доступен, он подключится к мастеру. Если настроить +[[yii\db\Connection::serverStatusCache|кеш статуса серверов]], то недоступность серверов может быть запомнена, чтоб не +использоваться в течении [[yii\db\Connection::serverRetryInterval|заданного промежутка времени]]. + +> Информация: В конфигурации выше, таймаут соединения к подчинённому серверу настроен на 10 секунд. + Это означает, что если сервер не ответит за 10 секунд, он будет считаться "мёртвым". Вы можете отрегулировать + этот параметр исходя из настроек вашей среды. + +Вы также можете настроить несколько основных и несколько подчинённых серверов. Например: + +```php +[ + 'class' => 'yii\db\Connection', + + // общая конфигурация для основных серверов + 'masterConfig' => [ + 'username' => 'master', + 'password' => '', + 'attributes' => [ + // используем небольшой таймаут для соединения + PDO::ATTR_TIMEOUT => 10, + ], + ], + + // список настроек для основных серверов + 'masters' => [ + ['dsn' => 'dsn for master server 1'], + ['dsn' => 'dsn for master server 2'], + ], + + // общие настройки для подчинённых + 'slaveConfig' => [ + 'username' => 'slave', + 'password' => '', + 'attributes' => [ + // используем небольшой таймаут для соединения + PDO::ATTR_TIMEOUT => 10, + ], + ], + + // список настроек для подчинённых серверов + 'slaves' => [ + ['dsn' => 'dsn for slave server 1'], + ['dsn' => 'dsn for slave server 2'], + ['dsn' => 'dsn for slave server 3'], + ['dsn' => 'dsn for slave server 4'], + ], +] +``` + +Конфигурация выше, определяет два основных и четыре подчинённых серверов. Компонент `Connection` поддерживает +балансировку нагрузки и переключение при сбое между основными серверами, также как и между подчинёнными. Различие +заключается в том, что когда ни к одному из основных серверов не удастся подключиться будет выброшено исключение. + +> Примечание: Когда вы используете свойство [[yii\db\Connection::masters|masters]] для настройки одного или нескольких + основных серверов, все остальные свойства для настройки соединения с базой данных (такие как `dsn`, `username`, `password`) + будут проигнорированы компонентом `Connection`. + +По умолчанию, транзакции используют соединение с основным сервером. И в рамках транзакции, все операции с БД будут +использовать соединение с основным сервером. Например, + +```php +// Транзакция запускается на основном сервере +$transaction = $db->beginTransaction(); + +try { + // оба запроса выполняются на основном сервере + $rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll(); + $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute(); + + $transaction->commit(); +} catch(\Exception $e) { + $transaction->rollBack(); + throw $e; +} +``` + +Если вы хотите запустить транзакцию на подчинённом сервере, вы должны указать это явно, как показано ниже: + +```php +$transaction = $db->slave->beginTransaction(); +``` + +Иногда может потребоваться выполнить запрос на чтение через подключение к основному серверу. Это может быть достигнуто +с использованием метода `useMaster()`: + +```php +$rows = $db->useMaster(function ($db) { + return $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll(); +}); +``` + +Вы также можете явно установить `$db->enableSlaves` в ложь, чтоб направлять все запросы к соединению с мастером. + + +## Работа со схемой базы данных + +Yii DAO предоставляет целый набор методов для управления схемой базы данных, таких как создание новых таблиц, удаление +столбцов из таблицы, и т.д.. Эти методы описаны ниже: + +* [[yii\db\Command::createTable()|createTable()]]: создание таблицы +* [[yii\db\Command::renameTable()|renameTable()]]: переименование таблицы +* [[yii\db\Command::dropTable()|dropTable()]]: удаление таблицы +* [[yii\db\Command::truncateTable()|truncateTable()]]: удаление всех записей в таблице +* [[yii\db\Command::addColumn()|addColumn()]]: добавление столбца +* [[yii\db\Command::renameColumn()|renameColumn()]]: переименование столбца +* [[yii\db\Command::dropColumn()|dropColumn()]]: удаление столбца +* [[yii\db\Command::alterColumn()|alterColumn()]]: преобразование столбца +* [[yii\db\Command::addPrimaryKey()|addPrimaryKey()]]: добавление первичного ключа +* [[yii\db\Command::dropPrimaryKey()|dropPrimaryKey()]]: удаление первичного ключа +* [[yii\db\Command::addForeignKey()|addForeignKey()]]: добавление внешнего ключа +* [[yii\db\Command::dropForeignKey()|dropForeignKey()]]: удаление внешнего ключа +* [[yii\db\Command::createIndex()|createIndex()]]: создания индекса +* [[yii\db\Command::dropIndex()|dropIndex()]]: удаление индекса + +Эти методы могут быть использованы, как указано ниже: + +```php +// CREATE TABLE +$db->createCommand()->createTable('post', [ + 'id' => 'pk', + 'title' => 'string', + 'text' => 'text', +]); +``` + +Вы также сможете получить описание схемы таблицы через вызов метода [[yii\db\Connection::getTableSchema()|getTableSchema()]]. +Например: + +```php +$table = $db->getTableSchema('post'); +``` + +Метод вернёт объект [[yii\db\TableSchema]], который содержит информацию о столбцах таблицы, первичных ключах, внешних +ключах, и т.д.. Вся эта информация используется главным образом для [построителя запросов](db-query-builder.md) и +[active record](db-active-record.md), чтоб помочь вам писать независимый от базы данных код.