mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-02 13:02:24 +08:00
Russian translation fixes and updates [skip ci]
This commit is contained in:
committed by
Alexander Makarov
parent
4c452d1b04
commit
f3fddb2993
@ -140,7 +140,7 @@ $config = [
|
|||||||
|
|
||||||
При использовании [виджетов](structure-widgets.md) часто возникает необходимость изменить параметры виджета с помощью
|
При использовании [виджетов](structure-widgets.md) часто возникает необходимость изменить параметры виджета с помощью
|
||||||
конфигурации. Для создания виджета можно использовать два метода: [[yii\base\Widget::widget()]] и
|
конфигурации. Для создания виджета можно использовать два метода: [[yii\base\Widget::widget()]] и
|
||||||
[[yii\base\Widget::beginWidget()]]. Оба метода принимают конфигурацию в виде PHP массива:
|
[[yii\base\Widget::begin()]]. Оба метода принимают конфигурацию в виде PHP массива:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
use yii\widgets\Menu;
|
use yii\widgets\Menu;
|
||||||
|
|||||||
@ -5,16 +5,15 @@
|
|||||||
[Статья Мартина Фаулера](http://martinfowler.com/articles/injection.html) хорошо объясняет, почему контейнер внедрения зависимостей является полезным. Здесь, преимущественно, будет объясняться использование контейнера внедрения зависимостей, предоставляемого в Yii.
|
[Статья Мартина Фаулера](http://martinfowler.com/articles/injection.html) хорошо объясняет, почему контейнер внедрения зависимостей является полезным. Здесь, преимущественно, будет объясняться использование контейнера внедрения зависимостей, предоставляемого в Yii.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Внедрение зависимостей <span id="dependency-injection"></span>
|
Внедрение зависимостей <span id="dependency-injection"></span>
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
Yii обеспечивает функционал контейнера внедрения зависимостей через класс [[yii\di\Container]]. Он поддерживает следующие виды внедрения зависимостей:
|
Yii обеспечивает функционал контейнера внедрения зависимостей через класс [[yii\di\Container]]. Он поддерживает следующие виды внедрения зависимостей:
|
||||||
|
|
||||||
* Внедрение зависимости через конструктор.
|
* Внедрение зависимости через конструктор;
|
||||||
* Внедрение зависимости через сеттер и свойство.
|
* Внедрение зависимости через сеттер и свойство;
|
||||||
* Внедрение зависимости через PHP callback.
|
* Внедрение зависимости через PHP callback;
|
||||||
|
* Внедрение зависимости через действие контроллера.
|
||||||
|
|
||||||
|
|
||||||
### Внедрение зависимости через конструктор <span id="constructor-injection"></span>
|
### Внедрение зависимости через конструктор <span id="constructor-injection"></span>
|
||||||
@ -71,10 +70,8 @@ $container->get('Foo', [], [
|
|||||||
]);
|
]);
|
||||||
```
|
```
|
||||||
|
|
||||||
> Информация: Метод [[yii\di\Container::get()]] третьим аргументом принимает массив конфигурации, которым инициализируется
|
> Информация: Метод [[yii\di\Container::get()]] третьим аргументом принимает массив конфигурации, которым инициализируется создаваемый объект. Если класс реализует интерфейс [[yii\base\Configurable]] (например, [[yii\base\Object]]), то массив конфигурации передается в последний параметр конструктора класса. Иначе конфигурация применяется уже *после* создания объекта.
|
||||||
создаваемый объект. Если класс реализует интерфейс [[yii\base\Configurable]] (например, [[yii\base\Object]]),
|
|
||||||
то массив конфигурации передается в последний параметр конструктора класса. Иначе конфигурация применяется уже *после*
|
|
||||||
создания объекта.
|
|
||||||
|
|
||||||
### Внедрение зависимости через PHP callback <span id="php-callable-injection"></span>
|
### Внедрение зависимости через PHP callback <span id="php-callable-injection"></span>
|
||||||
|
|
||||||
@ -100,28 +97,39 @@ class FooBuilder
|
|||||||
{
|
{
|
||||||
public static function build()
|
public static function build()
|
||||||
{
|
{
|
||||||
return function () {
|
$foo = new Foo(new Bar);
|
||||||
$foo = new Foo(new Bar);
|
// ... дополнительная инициализация ...
|
||||||
// ... дополнительная инициализация
|
return $foo;
|
||||||
return $foo;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$container->set('Foo', FooBuilder::build());
|
$container->set('Foo', ['app\helper\FooBuilder', 'build']);
|
||||||
|
|
||||||
$foo = $container->get('Foo');
|
$foo = $container->get('Foo');
|
||||||
```
|
```
|
||||||
|
|
||||||
Как вы можете видеть, метод `FooBuilder::build()` возвращает анонимную функцию. Тот, кто будет настраивать класс `Foo`,
|
Теперь тот, кто будет настраивать класс `Foo`, не обязан знать, как этот класс устроен.
|
||||||
теперь не обязан знать, как этот класс устроен.
|
|
||||||
|
|
||||||
|
### Внедрение зависимости через действие контроллера <span id="controller-action-injection"></span>
|
||||||
|
|
||||||
|
Внедрение зависимости через действие контроллера - это специальный тип внедрения зависимостей, использующий указание типов параметров, принимаемых методом, исполняемый во время выполнения кода действия. Этот тип внедрения зависимостей помогает сделать контроллеры MVC *тонкими* и *легкими*, так как нет необходимости настраивать все возможные зависимости контроллера заранее.
|
||||||
|
|
||||||
|
```php
|
||||||
|
public function actionSend($email, EmailValidator $validator)
|
||||||
|
{
|
||||||
|
if ($validator->validate($email)) {
|
||||||
|
// ... отправка email
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Регистрация зависимостей <span id="registering-dependencies"></span>
|
Регистрация зависимостей <span id="registering-dependencies"></span>
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а также определение зависимости.
|
Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а также определение зависимости. Именем зависимости может быть имя класса, интерфейса или алиас,
|
||||||
Именем зависимости может быть имя класса, интерфейса или алиас, так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP callback'ом.
|
так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP callback'ом.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$container = new \yii\di\Container;
|
$container = new \yii\di\Container;
|
||||||
@ -269,7 +277,7 @@ $lister = new UserLister($finder);
|
|||||||
Практическое использование <span id="practical-usage"></span>
|
Практическое использование <span id="practical-usage"></span>
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md)
|
Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md)
|
||||||
вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]],
|
вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]],
|
||||||
метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], чтобы создать новый объект.
|
метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], чтобы создать новый объект.
|
||||||
Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект.
|
Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект.
|
||||||
|
|||||||
@ -59,8 +59,7 @@ return [
|
|||||||
> Подсказка: Вы можете настроить несколько компонентов подключения, если в вашем приложении используется несколько баз данных.
|
> Подсказка: Вы можете настроить несколько компонентов подключения, если в вашем приложении используется несколько баз данных.
|
||||||
|
|
||||||
При настройке подключения, вы должны обязательно указывать Имя Источника Данных (DSN) через параметр [[yii\db\Connection::dsn|dsn]].
|
При настройке подключения, вы должны обязательно указывать Имя Источника Данных (DSN) через параметр [[yii\db\Connection::dsn|dsn]].
|
||||||
Формат DSN отличается для разных баз данных. По
|
Формат DSN отличается для разных баз данных. Дополнительное описание смотрите в [справочнике PHP](http://php.net/manual/ru/pdo.construct.php).
|
||||||
The format of DSN varies for different databases. Дополнительное описание смотрите в [справочнике PHP](http://php.net/manual/ru/pdo.construct.php).
|
|
||||||
Ниже представлены несколько примеров:
|
Ниже представлены несколько примеров:
|
||||||
|
|
||||||
* MySQL, MariaDB: `mysql:host=localhost;dbname=mydatabase`
|
* MySQL, MariaDB: `mysql:host=localhost;dbname=mydatabase`
|
||||||
@ -73,7 +72,7 @@ The format of DSN varies for different databases. Дополнительное
|
|||||||
* Oracle: `oci:dbname=//localhost:1521/mydatabase`
|
* Oracle: `oci:dbname=//localhost:1521/mydatabase`
|
||||||
|
|
||||||
Заметьте, что если вы подключаетесь к базе данных через ODBC, вам необходимо указать свойство [[yii\db\Connection::driverName]],
|
Заметьте, что если вы подключаетесь к базе данных через ODBC, вам необходимо указать свойство [[yii\db\Connection::driverName]],
|
||||||
чтобы Yii знал какой тип базы данных используется. Например:
|
чтобы Yii знал какой тип базы данных используется. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
'db' => [
|
'db' => [
|
||||||
@ -142,7 +141,8 @@ $count = $db->createCommand('SELECT COUNT(*) FROM post')
|
|||||||
|
|
||||||
> Подсказка: Если вам необходимо выполнить SQL запрос сразу после установки соединения (например, для установки
|
> Подсказка: Если вам необходимо выполнить SQL запрос сразу после установки соединения (например, для установки
|
||||||
> временной зоны или кодировки), вы можете сделать это в обработчике события [[yii\db\Connection::EVENT_AFTER_OPEN]].
|
> временной зоны или кодировки), вы можете сделать это в обработчике события [[yii\db\Connection::EVENT_AFTER_OPEN]].
|
||||||
> Например:
|
> Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
return [
|
return [
|
||||||
// ...
|
// ...
|
||||||
@ -165,7 +165,7 @@ return [
|
|||||||
### Привязка параметров <span id="binding-parameters"></span>
|
### Привязка параметров <span id="binding-parameters"></span>
|
||||||
|
|
||||||
При создании команды из SQL запроса с параметрами, вы почти всегда должны использовать привязку параметров для
|
При создании команды из SQL запроса с параметрами, вы почти всегда должны использовать привязку параметров для
|
||||||
предотвращения атак через SQL инъекции. Например:
|
предотвращения атак через SQL инъекции. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
|
$post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
|
||||||
@ -175,7 +175,7 @@ $post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
|
|||||||
```
|
```
|
||||||
|
|
||||||
В SQL запрос, вы можете встраивать один или несколько маркеров (например `:id` в примере выше). Маркеры должны быть
|
В SQL запрос, вы можете встраивать один или несколько маркеров (например `:id` в примере выше). Маркеры должны быть
|
||||||
строкой начинающейся с двоеточия. Далее вам нужно вызвать один из следующих методов для привязки значений к параметрам:
|
строкой, начинающейся с двоеточия. Далее вам нужно вызвать один из следующих методов для привязки значений к параметрам:
|
||||||
|
|
||||||
* [[yii\db\Command::bindValue()|bindValue()]]: привязка одного параметра по значению
|
* [[yii\db\Command::bindValue()|bindValue()]]: привязка одного параметра по значению
|
||||||
* [[yii\db\Command::bindValues()|bindValues()]]: привязка нескольких параметров в одном вызове
|
* [[yii\db\Command::bindValues()|bindValues()]]: привязка нескольких параметров в одном вызове
|
||||||
@ -197,7 +197,7 @@ $post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status',
|
|||||||
|
|
||||||
Привязка переменных реализована через [подготавливаемые запросы](http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php).
|
Привязка переменных реализована через [подготавливаемые запросы](http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php).
|
||||||
Помимо предотвращения атак путём SQL инъекций, это увеличивает производительность, так как запрос подготавливается
|
Помимо предотвращения атак путём SQL инъекций, это увеличивает производительность, так как запрос подготавливается
|
||||||
один раз, а потом выполняется много раз с разными параметрами. Например:
|
один раз, а потом выполняется много раз с разными параметрами. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$command = $db->createCommand('SELECT * FROM post WHERE id=:id');
|
$command = $db->createCommand('SELECT * FROM post WHERE id=:id');
|
||||||
@ -227,7 +227,7 @@ $post2 = $command->queryOne();
|
|||||||
### Выполнение Не-SELECT запросов <span id="non-select-queries"></span>
|
### Выполнение Не-SELECT запросов <span id="non-select-queries"></span>
|
||||||
|
|
||||||
В методах `queryXyz()`, описанных в предыдущих разделах, вызываются SELECT запросы для извлечения данных из базы.
|
В методах `queryXyz()`, описанных в предыдущих разделах, вызываются SELECT запросы для извлечения данных из базы.
|
||||||
Для запросов не возвращающих данные, вы должны использовать метод [[yii\db\Command::execute()]]. Например:
|
Для запросов не возвращающих данные, вы должны использовать метод [[yii\db\Command::execute()]]. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$db->createCommand('UPDATE post SET status=1 WHERE id=1')
|
$db->createCommand('UPDATE post SET status=1 WHERE id=1')
|
||||||
@ -238,7 +238,7 @@ $db->createCommand('UPDATE post SET status=1 WHERE id=1')
|
|||||||
|
|
||||||
Для запросов INSERT, UPDATE и DELETE, вместо написания чистого SQL, вы можете вызвать методы [[yii\db\Command::insert()|insert()]],
|
Для запросов INSERT, UPDATE и DELETE, вместо написания чистого SQL, вы можете вызвать методы [[yii\db\Command::insert()|insert()]],
|
||||||
[[yii\db\Command::update()|update()]], [[yii\db\Command::delete()|delete()]], соответственно, для создания указанных
|
[[yii\db\Command::update()|update()]], [[yii\db\Command::delete()|delete()]], соответственно, для создания указанных
|
||||||
SQL конструкций. Например:
|
SQL конструкций. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// INSERT (table name, column values)
|
// INSERT (table name, column values)
|
||||||
@ -307,7 +307,7 @@ return [
|
|||||||
|
|
||||||
Затем в коде, когда вам нужно ссылаться на таблицу, имя которой содержит такой префикс, используйте синтаксис `{{%table name}}`.
|
Затем в коде, когда вам нужно ссылаться на таблицу, имя которой содержит такой префикс, используйте синтаксис `{{%table name}}`.
|
||||||
Символ процента будет автоматический заменён на префикс таблицы, который вы указали во время конфигурации соединения с
|
Символ процента будет автоматический заменён на префикс таблицы, который вы указали во время конфигурации соединения с
|
||||||
базой данных. Например:
|
базой данных. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// для MySQL будет выполнен следующий SQL: SELECT COUNT(`id`) FROM `tbl_employee`
|
// для MySQL будет выполнен следующий SQL: SELECT COUNT(`id`) FROM `tbl_employee`
|
||||||
@ -426,12 +426,12 @@ try {
|
|||||||
try {
|
try {
|
||||||
$db->createCommand($sql2)->execute();
|
$db->createCommand($sql2)->execute();
|
||||||
$innerTransaction->commit();
|
$innerTransaction->commit();
|
||||||
} catch (Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$innerTransaction->rollBack();
|
$innerTransaction->rollBack();
|
||||||
}
|
}
|
||||||
|
|
||||||
$outerTransaction->commit();
|
$outerTransaction->commit();
|
||||||
} catch (Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$outerTransaction->rollBack();
|
$outerTransaction->rollBack();
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -478,7 +478,7 @@ try {
|
|||||||
|
|
||||||
Вышеуказанная конфигурация определяет систему с одним мастером и несколькими подчинёнными. Один из подчинённых
|
Вышеуказанная конфигурация определяет систему с одним мастером и несколькими подчинёнными. Один из подчинённых
|
||||||
будет подключен и использован для чтения, в то время как мастер будет использоваться для запросов записи.
|
будет подключен и использован для чтения, в то время как мастер будет использоваться для запросов записи.
|
||||||
Такое разделение чтения и записи будет осуществлено автоматический с указанной конфигурацией. Например:
|
Такое разделение чтения и записи будет осуществлено автоматический с указанной конфигурацией. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// создание экземпляра соединения, использующего вышеуказанную конфигурацию
|
// создание экземпляра соединения, использующего вышеуказанную конфигурацию
|
||||||
@ -506,7 +506,7 @@ $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
|
|||||||
Это означает, что если сервер не ответит за 10 секунд, он будет считаться "мёртвым". Вы можете отрегулировать
|
Это означает, что если сервер не ответит за 10 секунд, он будет считаться "мёртвым". Вы можете отрегулировать
|
||||||
этот параметр исходя из настроек вашей среды.
|
этот параметр исходя из настроек вашей среды.
|
||||||
|
|
||||||
Вы также можете настроить несколько основных и несколько подчинённых серверов. Например:
|
Вы также можете настроить несколько основных и несколько подчинённых серверов. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
[
|
[
|
||||||
@ -625,7 +625,7 @@ $db->createCommand()->createTable('post', [
|
|||||||
```
|
```
|
||||||
|
|
||||||
Вы также сможете получить описание схемы таблицы через вызов метода [[yii\db\Connection::getTableSchema()|getTableSchema()]].
|
Вы также сможете получить описание схемы таблицы через вызов метода [[yii\db\Connection::getTableSchema()|getTableSchema()]].
|
||||||
Например:
|
Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$table = $db->getTableSchema('post');
|
$table = $db->getTableSchema('post');
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
Миграции Баз Данных
|
Миграции Баз Данных
|
||||||
==================
|
==================
|
||||||
|
|
||||||
В ходе разработки и ведения баз данных приложений, которые управляют данными, структуры используемых баз данных развиваются как и исходный код приложений. Например, при разработке приложения, в будущем может оказаться необходимой новая таблица; уже после того, как приложение будет развернуто в рабочем режиме (продакшене), также может быть обнаружено, что для повышения производительности запросов должен быть создан определённый индекс; и так далее.
|
В ходе разработки и ведения баз данных приложений, которые управляют данными, структуры используемых баз данных развиваются, как и исходный код приложений. Например, при разработке приложения, в будущем может оказаться необходимой новая таблица; уже после того, как приложение будет развернуто в рабочем режиме (продакшене), также может быть обнаружено, что для повышения производительности запросов должен быть создан определённый индекс; и так далее.
|
||||||
В связи с тем, что изменение структуры базы данных часто требует изменение исходного кода, yii поддерживает так
|
В связи с тем, что изменение структуры базы данных часто требует изменение исходного кода, yii поддерживает так
|
||||||
называемую возможность *миграции баз данных*, которая позволяет отслеживать изменения в базах данных при помощи терминов *миграции баз данных*, которые являются системой контроля версий вместе с исходным кодом.
|
называемую возможность *миграции баз данных*, которая позволяет отслеживать изменения в базах данных при помощи терминов *миграции баз данных*, которые являются системой контроля версий вместе с исходным кодом.
|
||||||
|
|
||||||
@ -28,6 +28,9 @@ Yii предоставляет набор инструментов для миг
|
|||||||
|
|
||||||
Все эти инструменты доступны через команду `yii migrate`. В этом разделе мы опишем подробно, как выполнять различные задачи, используя эти инструменты. Вы также можете сами посмотреть как использовать каждый отдельный инструмент при помощи команды `yii help migrate`.
|
Все эти инструменты доступны через команду `yii migrate`. В этом разделе мы опишем подробно, как выполнять различные задачи, используя эти инструменты. Вы также можете сами посмотреть как использовать каждый отдельный инструмент при помощи команды `yii help migrate`.
|
||||||
|
|
||||||
|
> Подсказка: Миграции могут не только изменять схему базы данных, но и приводить данные в соответствие с новой схемой, создавать иерархию RBAC или очищать кеш.
|
||||||
|
|
||||||
|
|
||||||
## Создание миграций <span id="creating-migrations"></span>
|
## Создание миграций <span id="creating-migrations"></span>
|
||||||
|
|
||||||
Чтобы создать новую миграцию, выполните следующую команду:
|
Чтобы создать новую миграцию, выполните следующую команду:
|
||||||
@ -49,20 +52,32 @@ yii migrate/create create_news_table
|
|||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use yii\db\Schema;
|
|
||||||
use yii\db\Migration;
|
use yii\db\Migration;
|
||||||
|
|
||||||
class m150101_185401_create_news_table extends Migration
|
class m150101_185401_create_news_table extends Migration
|
||||||
{
|
{
|
||||||
public function up()
|
public function up()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function down()
|
public function down()
|
||||||
{
|
{
|
||||||
echo "m101129_185401_create_news_table cannot be reverted.\n";
|
echo "m101129_185401_create_news_table cannot be reverted.\n";
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Use safeUp/safeDown to run migration code within a transaction
|
||||||
|
public function safeUp()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function safeDown()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -76,11 +91,12 @@ class m150101_185401_create_news_table extends Migration
|
|||||||
Следующий код показывает как можно реализовать класс миграции, чтобы создать таблицу `news`:
|
Следующий код показывает как можно реализовать класс миграции, чтобы создать таблицу `news`:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
use yii\db\Schema;
|
use yii\db\Schema;
|
||||||
use yii\db\Migration;
|
use yii\db\Migration;
|
||||||
|
|
||||||
class m150101_185401_create_news_table extends \yii\db\Migration
|
class m150101_185401_create_news_table extends Migration
|
||||||
{
|
{
|
||||||
public function up()
|
public function up()
|
||||||
{
|
{
|
||||||
@ -95,11 +111,10 @@ class m150101_185401_create_news_table extends \yii\db\Migration
|
|||||||
{
|
{
|
||||||
$this->dropTable('news');
|
$this->dropTable('news');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
> Для справки: Не все миграции являются обратимыми. Например, если метод `up()` удаляет строку из таблицы, возможно что у вас уже не будет возможности вернуть эту строку методом `down()`. Иногда Вам может быть просто слишком лень реализовывать метод `down()`, в связи с тем, что это не очень распространено - откатывать миграции базы данных. В этом случае вы должны в методе `down()` вернуть `false`, чтобы указать, что миграция не является обратимой.
|
> Информация: Не все миграции являются обратимыми. Например, если метод `up()` удаляет строку из таблицы, возможно что у вас уже не будет возможности вернуть эту строку методом `down()`. Иногда Вам может быть просто слишком лень реализовывать метод `down()`, в связи с тем, что это не очень распространено - откатывать миграции базы данных. В этом случае вы должны в методе `down()` вернуть `false`, чтобы указать, что миграция не является обратимой.
|
||||||
|
|
||||||
Базовый класс миграций [[yii\db\Migration]] предоставляет подключение к базе данных через свойство [[yii\db\Migration::db|db]]. Вы можете использовать его для манипулирования схемой базы данных используя методы описанные в [работе со схемой базы данных](db-dao.md#database-schema).
|
Базовый класс миграций [[yii\db\Migration]] предоставляет подключение к базе данных через свойство [[yii\db\Migration::db|db]]. Вы можете использовать его для манипулирования схемой базы данных используя методы описанные в [работе со схемой базы данных](db-dao.md#database-schema).
|
||||||
|
|
||||||
@ -111,7 +126,36 @@ class m150101_185401_create_news_table extends \yii\db\Migration
|
|||||||
|
|
||||||
Вы можете добавить дополнительные ограничения при использовании абстрактных типов. В приведенном выше примере, ` NOT NULL` добавляется к `Schema::TYPE_STRING` чтобы указать, что столбец не может быть NULL.
|
Вы можете добавить дополнительные ограничения при использовании абстрактных типов. В приведенном выше примере, ` NOT NULL` добавляется к `Schema::TYPE_STRING` чтобы указать, что столбец не может быть NULL.
|
||||||
|
|
||||||
> Для справки: Сопоставление абстрактных типов и физических типов определяется свойством [[yii\db\QueryBuilder::$typeMap|$typeMap]] в каждом конкретном `QueryBuilder` классе.
|
> Информация: Сопоставление абстрактных типов и физических типов определяется свойством [[yii\db\QueryBuilder::$typeMap|$typeMap]] в каждом конкретном `QueryBuilder` классе.
|
||||||
|
|
||||||
|
Начиная с версии 2.0.6, появился новый построитель схем, который является более удобным инструментом для описания структуры столбцов.
|
||||||
|
Теперь, при написании миграций, можно использовать такой код:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use yii\db\Migration;
|
||||||
|
|
||||||
|
class m150101_185401_create_news_table extends Migration
|
||||||
|
{
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
$this->createTable('news', [
|
||||||
|
'id' => $this->primaryKey(),
|
||||||
|
'title' => $this->string()->notNull(),
|
||||||
|
'content' => $this->text(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
$this->dropTable('news');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Весь список методов описания типов столбцов доступен в API документации [[yii\db\SchemaBuilderTrait]].
|
||||||
|
|
||||||
|
|
||||||
### Транзакции Миграций <span id="transactional-migrations"></span>
|
### Транзакции Миграций <span id="transactional-migrations"></span>
|
||||||
|
|
||||||
@ -122,8 +166,8 @@ class m150101_185401_create_news_table extends \yii\db\Migration
|
|||||||
В следующем примере, помимо создания таблицы `news` мы также вставляем в этой таблице начальную строку.
|
В следующем примере, помимо создания таблицы `news` мы также вставляем в этой таблице начальную строку.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
use yii\db\Schema;
|
|
||||||
use yii\db\Migration;
|
use yii\db\Migration;
|
||||||
|
|
||||||
class m150101_185401_create_news_table extends Migration
|
class m150101_185401_create_news_table extends Migration
|
||||||
@ -131,11 +175,11 @@ class m150101_185401_create_news_table extends Migration
|
|||||||
public function safeUp()
|
public function safeUp()
|
||||||
{
|
{
|
||||||
$this->createTable('news', [
|
$this->createTable('news', [
|
||||||
'id' => 'pk',
|
'id' => $this->primaryKey(),
|
||||||
'title' => Schema::TYPE_STRING . ' NOT NULL',
|
'title' => $this->string()->notNull(),
|
||||||
'content' => Schema::TYPE_TEXT,
|
'content' => $this->text(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->insert('news', [
|
$this->insert('news', [
|
||||||
'title' => 'test 1',
|
'title' => 'test 1',
|
||||||
'content' => 'content 1',
|
'content' => 'content 1',
|
||||||
@ -184,7 +228,10 @@ class m150101_185401_create_news_table extends Migration
|
|||||||
* [[yii\db\Migration::createIndex()|createIndex()]]: создание индекса
|
* [[yii\db\Migration::createIndex()|createIndex()]]: создание индекса
|
||||||
* [[yii\db\Migration::dropIndex()|dropIndex()]]: удаление индекса
|
* [[yii\db\Migration::dropIndex()|dropIndex()]]: удаление индекса
|
||||||
|
|
||||||
> Примечание: [[yii\db\Migration]] не предоставляет методы запросов к базе данных. Это потому, что обычно не требуется отображать дополнительные сообщения об извлечении данных из базы данных. Это также, потому, что можно использовать более мощный [Построитель Запросов](db-query-builder.md) для построения и выполнения сложных запросов.
|
> Информация: [[yii\db\Migration]] не предоставляет методы запросов к базе данных. Это потому, что обычно не требуется отображать дополнительные сообщения об извлечении данных из базы данных. Это также, потому, что можно использовать более мощный [Построитель Запросов](db-query-builder.md) для построения и выполнения сложных запросов.
|
||||||
|
|
||||||
|
> Примечание: при обработке данных внутри миграции, может показаться, что использование существующих классов [Active Record](db-active-record.md), со всей их готовой бизнес логикой, будет разумным решением и упросит код миграции. Однако, следует помнить, что код миграций не должен меняться, по определению. В отличии от миграций, бизнес логика приложений часто изменяется. Это может привести к нарушению работы миграции при определённых изменениях на уровне Active Record. Поэтому рекомендуется делать миграции независимыми от других частей приложения, таких как классы Active Record.
|
||||||
|
|
||||||
|
|
||||||
## Применение Миграций <span id="applying-migrations"></span>
|
## Применение Миграций <span id="applying-migrations"></span>
|
||||||
|
|
||||||
@ -327,7 +374,8 @@ yii migrate --db=db2
|
|||||||
Иногда может случиться так, что Вы захотите применить *некоторые* из миграций к одной базе данных, а некоторые другие к другой базе данных. Для достижения этой цели, при реализации класса миграции, необходимо явно указать идентификатор ID компонента базы данных, который миграция будет использовать, следующим образом:
|
Иногда может случиться так, что Вы захотите применить *некоторые* из миграций к одной базе данных, а некоторые другие к другой базе данных. Для достижения этой цели, при реализации класса миграции, необходимо явно указать идентификатор ID компонента базы данных, который миграция будет использовать, следующим образом:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
use yii\db\Schema;
|
<?php
|
||||||
|
|
||||||
use yii\db\Migration;
|
use yii\db\Migration;
|
||||||
|
|
||||||
class m150101_185401_create_news_table extends Migration
|
class m150101_185401_create_news_table extends Migration
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
====================
|
====================
|
||||||
|
|
||||||
Построенный поверх [DAO](db-dao.md), построитель запросов позволяет конструировать SQL выражения в программируемом и
|
Построенный поверх [DAO](db-dao.md), построитель запросов позволяет конструировать SQL выражения в программируемом и
|
||||||
независимом от СУБД виде. В сравнении с написанием чистого SQL, использование построителя помогает вам писать
|
независимом от СУБД виде. В сравнении с написанием чистого SQL выражения, использование построителя помогает
|
||||||
более читаемый связанный с SQL код и генерировать более безопасные SQL выражения.
|
вам писать более читаемый связанный с SQL код и генерировать более безопасные SQL выражения.
|
||||||
|
|
||||||
Использование построителя запросов, как правило, включает два этапа:
|
Использование построителя запросов, как правило, включает два этапа:
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ LIMIT 10
|
|||||||
```
|
```
|
||||||
|
|
||||||
> Информация: В основном вы будете работать с [[yii\db\Query]] вместо [[yii\db\QueryBuilder]]. Последний вызывается
|
> Информация: В основном вы будете работать с [[yii\db\Query]] вместо [[yii\db\QueryBuilder]]. Последний вызывается
|
||||||
неявно при вызове одного из методов запроса. [[yii\db\QueryBuilder]] это класс отвечающий за генерацию зависимого
|
неявно при вызове одного из методов запроса. [[yii\db\QueryBuilder]] это класс, отвечающий за генерацию зависимого
|
||||||
от СУБД SQL выражения (такие как экранирование имён таблиц/столбцов) из независимых от СУБД объектов [[yii\db\Query]].
|
от СУБД SQL выражения (такие как экранирование имён таблиц/столбцов) из независимых от СУБД объектов [[yii\db\Query]].
|
||||||
|
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ $query->select(['id', 'email']);
|
|||||||
$query->select('id, email');
|
$query->select('id, email');
|
||||||
```
|
```
|
||||||
|
|
||||||
Имена столбцов могут быть выбраны вместе с префиксами таблиц и/или алиасами столбцов, также как при записи обычного SQL.
|
Имена столбцов могут быть выбраны вместе с префиксами таблиц и/или алиасами столбцов, также как при записи обычного SQL выражения.
|
||||||
Например,
|
Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
@ -80,14 +80,14 @@ $query->select(['user_id' => 'user.id', 'email']);
|
|||||||
выбрать *все* столбцы.
|
выбрать *все* столбцы.
|
||||||
|
|
||||||
Кроме имён столбцов, вы можете также использовать SQL выражения. Вы должны использовать формат массива для использования
|
Кроме имён столбцов, вы можете также использовать SQL выражения. Вы должны использовать формат массива для использования
|
||||||
выражений, которые содержат запятые для предотвращения некорректного автоматического экранирования. Например:
|
выражений, которые содержат запятые для предотвращения некорректного автоматического экранирования. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$query->select(["CONCAT(first_name, ' ', last_name) AS full_name", 'email']);
|
$query->select(["CONCAT(first_name, ' ', last_name) AS full_name", 'email']);
|
||||||
```
|
```
|
||||||
|
|
||||||
Начиная с версии 2.0.1, вы также можете использовать подзапросы. Вы должны указывать каждый подзапрос в выражении как
|
Начиная с версии 2.0.1, вы также можете использовать подзапросы. Вы должны указывать каждый подзапрос в выражении как
|
||||||
объект [[yii\db\Query]]. Например:
|
объект [[yii\db\Query]]. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$subQuery = (new Query())->select('COUNT(*)')->from('user');
|
$subQuery = (new Query())->select('COUNT(*)')->from('user');
|
||||||
@ -103,7 +103,7 @@ $query = (new Query())->select(['id', 'count' => $subQuery])->from('post');
|
|||||||
$query->select('user_id')->distinct();
|
$query->select('user_id')->distinct();
|
||||||
```
|
```
|
||||||
|
|
||||||
Вы можете вызвать [[yii\db\Query::addSelect()|addSelect()]] для добавления полей. Например:
|
Вы можете вызвать [[yii\db\Query::addSelect()|addSelect()]] для добавления полей. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$query->select(['id', 'username'])
|
$query->select(['id', 'username'])
|
||||||
@ -113,7 +113,7 @@ $query->select(['id', 'username'])
|
|||||||
|
|
||||||
### [[yii\db\Query::from()|from()]] <span id="from"></span>
|
### [[yii\db\Query::from()|from()]] <span id="from"></span>
|
||||||
|
|
||||||
Метод [[yii\db\Query::from()|from()]] указывает фрагмент `FROM` SQL запроса. Например:
|
Метод [[yii\db\Query::from()|from()]] указывает фрагмент `FROM` SQL запроса. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// SELECT * FROM `user`
|
// SELECT * FROM `user`
|
||||||
@ -121,7 +121,7 @@ $query->from('user');
|
|||||||
```
|
```
|
||||||
|
|
||||||
Вы можете указать имена таблиц в виде строки или массива. Имена таблиц могут содержать префикс схемы и/или алиасы
|
Вы можете указать имена таблиц в виде строки или массива. Имена таблиц могут содержать префикс схемы и/или алиасы
|
||||||
таблиц, как при написании обычного SQL. Например:
|
таблиц, как при написании обычного SQL выражения. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$query->from(['public.user u', 'public.post p']);
|
$query->from(['public.user u', 'public.post p']);
|
||||||
@ -137,7 +137,7 @@ $query->from('public.user u, public.post p');
|
|||||||
$query->from(['u' => 'public.user', 'p' => 'public.post']);
|
$query->from(['u' => 'public.user', 'p' => 'public.post']);
|
||||||
```
|
```
|
||||||
|
|
||||||
Кроме имён таблиц, вы можете, также как и в select, указывать подзапросы в виде объекта [[yii\db\Query]].
|
Кроме имён таблиц, вы можете, также, как и в select, указывать подзапросы в виде объекта [[yii\db\Query]].
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
|
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
|
||||||
@ -152,14 +152,14 @@ $query->from(['u' => $subQuery]);
|
|||||||
Метод [[yii\db\Query::where()|where()]] определяет фрагмент `WHERE` SQL выражения. Вы можете использовать один из
|
Метод [[yii\db\Query::where()|where()]] определяет фрагмент `WHERE` SQL выражения. Вы можете использовать один из
|
||||||
трёх форматов:
|
трёх форматов:
|
||||||
|
|
||||||
- строковый формат, например: `'status=1'`
|
- строковый формат, Например, `'status=1'`
|
||||||
- формат массива, например: `['status' => 1, 'type' => 2]`
|
- формат массива, Например, `['status' => 1, 'type' => 2]`
|
||||||
- формат операторов, например: `['like', 'name', 'test']`
|
- формат операторов, Например, `['like', 'name', 'test']`
|
||||||
|
|
||||||
|
|
||||||
#### Строковый формат <span id="string-format"></span>
|
#### Строковый формат <span id="string-format"></span>
|
||||||
|
|
||||||
Строковый формат - это лучший выбор для простых условий. Он работает так, будто вы просто пишете SQL запрос. Например:
|
Строковый формат - это лучший выбор для простых условий. Он работает так, будто вы просто пишете SQL запрос. Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$query->where('status=1');
|
$query->where('status=1');
|
||||||
@ -281,7 +281,7 @@ $query->where(['id' => $userQuery]);
|
|||||||
|
|
||||||
Вы можете использовать [[yii\db\Query::andWhere()|andWhere()]] или [[yii\db\Query::orWhere()|orWhere()]] для добавления
|
Вы можете использовать [[yii\db\Query::andWhere()|andWhere()]] или [[yii\db\Query::orWhere()|orWhere()]] для добавления
|
||||||
дополнительных условий. Вы можете использовать эти вызовы несколько раз для добавления нескольких условий.
|
дополнительных условий. Вы можете использовать эти вызовы несколько раз для добавления нескольких условий.
|
||||||
Например:
|
Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$status = 10;
|
$status = 10;
|
||||||
@ -317,7 +317,7 @@ $query->filterWhere([
|
|||||||
```
|
```
|
||||||
|
|
||||||
Единственное отличие между [[yii\db\Query::filterWhere()|filterWhere()]] и [[yii\db\Query::where()|where()]]
|
Единственное отличие между [[yii\db\Query::filterWhere()|filterWhere()]] и [[yii\db\Query::where()|where()]]
|
||||||
заключается в игнорировании пустых значений переданных в условие в [форме массива](#hash-format). Таким образом
|
заключается в игнорировании пустых значений, переданных в условие в [форме массива](#hash-format). Таким образом
|
||||||
если `$email` будет пустым, а `$username` нет, то приведённый выше код сформирует `...WHERE username=:username`.
|
если `$email` будет пустым, а `$username` нет, то приведённый выше код сформирует `...WHERE username=:username`.
|
||||||
|
|
||||||
> Информация: значение признаётся пустым, если это null, пустой массив, пустая строка или строка состоящая из одних пробельных символов.
|
> Информация: значение признаётся пустым, если это null, пустой массив, пустая строка или строка состоящая из одних пробельных символов.
|
||||||
@ -339,7 +339,7 @@ $query->orderBy([
|
|||||||
]);
|
]);
|
||||||
```
|
```
|
||||||
|
|
||||||
В данном коде, ключи массива это имена столбцов, а значения массива это соответствующее направление сортировки.
|
В данном коде, ключи массива - это имена столбцов, а значения массива - это соответствующее направление сортировки.
|
||||||
PHP константа `SORT_ASC` определяет сортировку по возрастанию и `SORT_DESC` сортировка по умолчанию.
|
PHP константа `SORT_ASC` определяет сортировку по возрастанию и `SORT_DESC` сортировка по умолчанию.
|
||||||
|
|
||||||
Если `ORDER BY` содержит только простые имена столбцов, вы можете определить их с помощью столбцов, также
|
Если `ORDER BY` содержит только простые имена столбцов, вы можете определить их с помощью столбцов, также
|
||||||
@ -369,7 +369,7 @@ $query->groupBy(['id', 'status']);
|
|||||||
```
|
```
|
||||||
|
|
||||||
Если фрагмент `GROUP BY` содержит только простые имена столбцов, вы можете указать их используя строку, также как в
|
Если фрагмент `GROUP BY` содержит только простые имена столбцов, вы можете указать их используя строку, также как в
|
||||||
обычном SQL.
|
обычном SQL выражении.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$query->groupBy('id, status');
|
$query->groupBy('id, status');
|
||||||
@ -501,7 +501,7 @@ $query1->union($query2);
|
|||||||
[[yii\db\Query::max()|max($q)]], [[yii\db\Query::min()|min($q)]]. Параметр `$q` обязателен для этих методов и могут
|
[[yii\db\Query::max()|max($q)]], [[yii\db\Query::min()|min($q)]]. Параметр `$q` обязателен для этих методов и могут
|
||||||
содержать либо имя столбца, либо выражение БД.
|
содержать либо имя столбца, либо выражение БД.
|
||||||
|
|
||||||
Например:
|
Например,
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// SELECT `id`, `email` FROM `user`
|
// SELECT `id`, `email` FROM `user`
|
||||||
@ -520,7 +520,7 @@ $row = (new \yii\db\Query())
|
|||||||
> Примечание: метод [[yii\db\Query::one()|one()]] вернёт только первую строку результата запроса. Он НЕ добавляет
|
> Примечание: метод [[yii\db\Query::one()|one()]] вернёт только первую строку результата запроса. Он НЕ добавляет
|
||||||
`LIMIT 1` в генерируемый SQL. Это хорошо и предпочтительно если вы знаете, что запрос вернёт только одну или несколько
|
`LIMIT 1` в генерируемый SQL. Это хорошо и предпочтительно если вы знаете, что запрос вернёт только одну или несколько
|
||||||
строк данных (например, при запросе по первичному ключу). Однако, если запрос потенциально может вернут много
|
строк данных (например, при запросе по первичному ключу). Однако, если запрос потенциально может вернут много
|
||||||
строк данных, вы должны вызвать `limit(1)` для повышения производительности, Например:
|
строк данных, вы должны вызвать `limit(1)` для повышения производительности, Например,
|
||||||
`(new \yii\db\Query())->from('user')->limit(1)->one()`.
|
`(new \yii\db\Query())->from('user')->limit(1)->one()`.
|
||||||
|
|
||||||
Все методы выборки могут получать необязательный параметр `$db`, представляющий [[yii\db\Connection|соединение с БД]],
|
Все методы выборки могут получать необязательный параметр `$db`, представляющий [[yii\db\Connection|соединение с БД]],
|
||||||
@ -566,7 +566,7 @@ $rows = $command->queryAll();
|
|||||||
### Индексация результатов запроса <span id="indexing-query-results"></span>
|
### Индексация результатов запроса <span id="indexing-query-results"></span>
|
||||||
|
|
||||||
При вызове [[yii\db\Query::all()|all()]] возвращается массив строк индексированный последовательными целыми числами.
|
При вызове [[yii\db\Query::all()|all()]] возвращается массив строк индексированный последовательными целыми числами.
|
||||||
Иногда вам может потребоваться индексировать его по другому, например сделать индекс по указанному столбцу или
|
Иногда вам может потребоваться индексировать его по-другому, например, сделать индекс по указанному столбцу или
|
||||||
значением выражения. Вы можете реализовать такое поведение через вызов [[yii\db\Query::indexBy()|indexBy()]] перед
|
значением выражения. Вы можете реализовать такое поведение через вызов [[yii\db\Query::indexBy()|indexBy()]] перед
|
||||||
вызовом [[yii\db\Query::all()|all()]].
|
вызовом [[yii\db\Query::all()|all()]].
|
||||||
|
|
||||||
|
|||||||
@ -14,7 +14,7 @@ dependency injection:
|
|||||||
|
|
||||||
* Constructor injection;
|
* Constructor injection;
|
||||||
* Setter and property injection;
|
* Setter and property injection;
|
||||||
* PHP callable injection.
|
* PHP callable injection;
|
||||||
* Controller action injection.
|
* Controller action injection.
|
||||||
|
|
||||||
|
|
||||||
@ -133,6 +133,7 @@ public function actionSend($email, EmailValidator $validator)
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Registering Dependencies <span id="registering-dependencies"></span>
|
Registering Dependencies <span id="registering-dependencies"></span>
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user