mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-01 20:19:42 +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) часто возникает необходимость изменить параметры виджета с помощью
|
||||
конфигурации. Для создания виджета можно использовать два метода: [[yii\base\Widget::widget()]] и
|
||||
[[yii\base\Widget::beginWidget()]]. Оба метода принимают конфигурацию в виде PHP массива:
|
||||
[[yii\base\Widget::begin()]]. Оба метода принимают конфигурацию в виде PHP массива:
|
||||
|
||||
```php
|
||||
use yii\widgets\Menu;
|
||||
|
||||
@ -5,16 +5,15 @@
|
||||
[Статья Мартина Фаулера](http://martinfowler.com/articles/injection.html) хорошо объясняет, почему контейнер внедрения зависимостей является полезным. Здесь, преимущественно, будет объясняться использование контейнера внедрения зависимостей, предоставляемого в Yii.
|
||||
|
||||
|
||||
|
||||
|
||||
Внедрение зависимостей <span id="dependency-injection"></span>
|
||||
--------------------
|
||||
|
||||
Yii обеспечивает функционал контейнера внедрения зависимостей через класс [[yii\di\Container]]. Он поддерживает следующие виды внедрения зависимостей:
|
||||
|
||||
* Внедрение зависимости через конструктор.
|
||||
* Внедрение зависимости через сеттер и свойство.
|
||||
* Внедрение зависимости через PHP callback.
|
||||
* Внедрение зависимости через конструктор;
|
||||
* Внедрение зависимости через сеттер и свойство;
|
||||
* Внедрение зависимости через PHP callback;
|
||||
* Внедрение зависимости через действие контроллера.
|
||||
|
||||
|
||||
### Внедрение зависимости через конструктор <span id="constructor-injection"></span>
|
||||
@ -71,10 +70,8 @@ $container->get('Foo', [], [
|
||||
]);
|
||||
```
|
||||
|
||||
> Информация: Метод [[yii\di\Container::get()]] третьим аргументом принимает массив конфигурации, которым инициализируется
|
||||
создаваемый объект. Если класс реализует интерфейс [[yii\base\Configurable]] (например, [[yii\base\Object]]),
|
||||
то массив конфигурации передается в последний параметр конструктора класса. Иначе конфигурация применяется уже *после*
|
||||
создания объекта.
|
||||
> Информация: Метод [[yii\di\Container::get()]] третьим аргументом принимает массив конфигурации, которым инициализируется создаваемый объект. Если класс реализует интерфейс [[yii\base\Configurable]] (например, [[yii\base\Object]]), то массив конфигурации передается в последний параметр конструктора класса. Иначе конфигурация применяется уже *после* создания объекта.
|
||||
|
||||
|
||||
### Внедрение зависимости через PHP callback <span id="php-callable-injection"></span>
|
||||
|
||||
@ -100,28 +97,39 @@ class FooBuilder
|
||||
{
|
||||
public static function build()
|
||||
{
|
||||
return function () {
|
||||
$foo = new Foo(new Bar);
|
||||
// ... дополнительная инициализация
|
||||
return $foo;
|
||||
};
|
||||
$foo = new Foo(new Bar);
|
||||
// ... дополнительная инициализация ...
|
||||
return $foo;
|
||||
}
|
||||
}
|
||||
|
||||
$container->set('Foo', FooBuilder::build());
|
||||
$container->set('Foo', ['app\helper\FooBuilder', 'build']);
|
||||
|
||||
$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>
|
||||
------------------------
|
||||
|
||||
Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а также определение зависимости.
|
||||
Именем зависимости может быть имя класса, интерфейса или алиас, так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP callback'ом.
|
||||
Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а также определение зависимости. Именем зависимости может быть имя класса, интерфейса или алиас,
|
||||
так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP callback'ом.
|
||||
|
||||
```php
|
||||
$container = new \yii\di\Container;
|
||||
@ -269,7 +277,7 @@ $lister = new UserLister($finder);
|
||||
Практическое использование <span id="practical-usage"></span>
|
||||
---------------
|
||||
|
||||
Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md)
|
||||
Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md)
|
||||
вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]],
|
||||
метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], чтобы создать новый объект.
|
||||
Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект.
|
||||
|
||||
@ -59,8 +59,7 @@ return [
|
||||
> Подсказка: Вы можете настроить несколько компонентов подключения, если в вашем приложении используется несколько баз данных.
|
||||
|
||||
При настройке подключения, вы должны обязательно указывать Имя Источника Данных (DSN) через параметр [[yii\db\Connection::dsn|dsn]].
|
||||
Формат DSN отличается для разных баз данных. По
|
||||
The format of DSN varies for different databases. Дополнительное описание смотрите в [справочнике PHP](http://php.net/manual/ru/pdo.construct.php).
|
||||
Формат DSN отличается для разных баз данных. Дополнительное описание смотрите в [справочнике PHP](http://php.net/manual/ru/pdo.construct.php).
|
||||
Ниже представлены несколько примеров:
|
||||
|
||||
* 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`
|
||||
|
||||
Заметьте, что если вы подключаетесь к базе данных через ODBC, вам необходимо указать свойство [[yii\db\Connection::driverName]],
|
||||
чтобы Yii знал какой тип базы данных используется. Например:
|
||||
чтобы Yii знал какой тип базы данных используется. Например,
|
||||
|
||||
```php
|
||||
'db' => [
|
||||
@ -142,7 +141,8 @@ $count = $db->createCommand('SELECT COUNT(*) FROM post')
|
||||
|
||||
> Подсказка: Если вам необходимо выполнить SQL запрос сразу после установки соединения (например, для установки
|
||||
> временной зоны или кодировки), вы можете сделать это в обработчике события [[yii\db\Connection::EVENT_AFTER_OPEN]].
|
||||
> Например:
|
||||
> Например,
|
||||
|
||||
```php
|
||||
return [
|
||||
// ...
|
||||
@ -165,7 +165,7 @@ return [
|
||||
### Привязка параметров <span id="binding-parameters"></span>
|
||||
|
||||
При создании команды из SQL запроса с параметрами, вы почти всегда должны использовать привязку параметров для
|
||||
предотвращения атак через SQL инъекции. Например:
|
||||
предотвращения атак через SQL инъекции. Например,
|
||||
|
||||
```php
|
||||
$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` в примере выше). Маркеры должны быть
|
||||
строкой начинающейся с двоеточия. Далее вам нужно вызвать один из следующих методов для привязки значений к параметрам:
|
||||
строкой, начинающейся с двоеточия. Далее вам нужно вызвать один из следующих методов для привязки значений к параметрам:
|
||||
|
||||
* [[yii\db\Command::bindValue()|bindValue()]]: привязка одного параметра по значению
|
||||
* [[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).
|
||||
Помимо предотвращения атак путём SQL инъекций, это увеличивает производительность, так как запрос подготавливается
|
||||
один раз, а потом выполняется много раз с разными параметрами. Например:
|
||||
один раз, а потом выполняется много раз с разными параметрами. Например,
|
||||
|
||||
```php
|
||||
$command = $db->createCommand('SELECT * FROM post WHERE id=:id');
|
||||
@ -227,7 +227,7 @@ $post2 = $command->queryOne();
|
||||
### Выполнение Не-SELECT запросов <span id="non-select-queries"></span>
|
||||
|
||||
В методах `queryXyz()`, описанных в предыдущих разделах, вызываются SELECT запросы для извлечения данных из базы.
|
||||
Для запросов не возвращающих данные, вы должны использовать метод [[yii\db\Command::execute()]]. Например:
|
||||
Для запросов не возвращающих данные, вы должны использовать метод [[yii\db\Command::execute()]]. Например,
|
||||
|
||||
```php
|
||||
$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()]],
|
||||
[[yii\db\Command::update()|update()]], [[yii\db\Command::delete()|delete()]], соответственно, для создания указанных
|
||||
SQL конструкций. Например:
|
||||
SQL конструкций. Например,
|
||||
|
||||
```php
|
||||
// INSERT (table name, column values)
|
||||
@ -307,7 +307,7 @@ return [
|
||||
|
||||
Затем в коде, когда вам нужно ссылаться на таблицу, имя которой содержит такой префикс, используйте синтаксис `{{%table name}}`.
|
||||
Символ процента будет автоматический заменён на префикс таблицы, который вы указали во время конфигурации соединения с
|
||||
базой данных. Например:
|
||||
базой данных. Например,
|
||||
|
||||
```php
|
||||
// для MySQL будет выполнен следующий SQL: SELECT COUNT(`id`) FROM `tbl_employee`
|
||||
@ -426,12 +426,12 @@ try {
|
||||
try {
|
||||
$db->createCommand($sql2)->execute();
|
||||
$innerTransaction->commit();
|
||||
} catch (Exception $e) {
|
||||
} catch (\Exception $e) {
|
||||
$innerTransaction->rollBack();
|
||||
}
|
||||
|
||||
$outerTransaction->commit();
|
||||
} catch (Exception $e) {
|
||||
} catch (\Exception $e) {
|
||||
$outerTransaction->rollBack();
|
||||
}
|
||||
```
|
||||
@ -478,7 +478,7 @@ try {
|
||||
|
||||
Вышеуказанная конфигурация определяет систему с одним мастером и несколькими подчинёнными. Один из подчинённых
|
||||
будет подключен и использован для чтения, в то время как мастер будет использоваться для запросов записи.
|
||||
Такое разделение чтения и записи будет осуществлено автоматический с указанной конфигурацией. Например:
|
||||
Такое разделение чтения и записи будет осуществлено автоматический с указанной конфигурацией. Например,
|
||||
|
||||
```php
|
||||
// создание экземпляра соединения, использующего вышеуказанную конфигурацию
|
||||
@ -506,7 +506,7 @@ $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
|
||||
Это означает, что если сервер не ответит за 10 секунд, он будет считаться "мёртвым". Вы можете отрегулировать
|
||||
этот параметр исходя из настроек вашей среды.
|
||||
|
||||
Вы также можете настроить несколько основных и несколько подчинённых серверов. Например:
|
||||
Вы также можете настроить несколько основных и несколько подчинённых серверов. Например,
|
||||
|
||||
```php
|
||||
[
|
||||
@ -625,7 +625,7 @@ $db->createCommand()->createTable('post', [
|
||||
```
|
||||
|
||||
Вы также сможете получить описание схемы таблицы через вызов метода [[yii\db\Connection::getTableSchema()|getTableSchema()]].
|
||||
Например:
|
||||
Например,
|
||||
|
||||
```php
|
||||
$table = $db->getTableSchema('post');
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
Миграции Баз Данных
|
||||
==================
|
||||
|
||||
В ходе разработки и ведения баз данных приложений, которые управляют данными, структуры используемых баз данных развиваются как и исходный код приложений. Например, при разработке приложения, в будущем может оказаться необходимой новая таблица; уже после того, как приложение будет развернуто в рабочем режиме (продакшене), также может быть обнаружено, что для повышения производительности запросов должен быть создан определённый индекс; и так далее.
|
||||
В ходе разработки и ведения баз данных приложений, которые управляют данными, структуры используемых баз данных развиваются, как и исходный код приложений. Например, при разработке приложения, в будущем может оказаться необходимой новая таблица; уже после того, как приложение будет развернуто в рабочем режиме (продакшене), также может быть обнаружено, что для повышения производительности запросов должен быть создан определённый индекс; и так далее.
|
||||
В связи с тем, что изменение структуры базы данных часто требует изменение исходного кода, yii поддерживает так
|
||||
называемую возможность *миграции баз данных*, которая позволяет отслеживать изменения в базах данных при помощи терминов *миграции баз данных*, которые являются системой контроля версий вместе с исходным кодом.
|
||||
|
||||
@ -28,6 +28,9 @@ Yii предоставляет набор инструментов для миг
|
||||
|
||||
Все эти инструменты доступны через команду `yii migrate`. В этом разделе мы опишем подробно, как выполнять различные задачи, используя эти инструменты. Вы также можете сами посмотреть как использовать каждый отдельный инструмент при помощи команды `yii help migrate`.
|
||||
|
||||
> Подсказка: Миграции могут не только изменять схему базы данных, но и приводить данные в соответствие с новой схемой, создавать иерархию RBAC или очищать кеш.
|
||||
|
||||
|
||||
## Создание миграций <span id="creating-migrations"></span>
|
||||
|
||||
Чтобы создать новую миграцию, выполните следующую команду:
|
||||
@ -49,20 +52,32 @@ yii migrate/create create_news_table
|
||||
```php
|
||||
<?php
|
||||
|
||||
use yii\db\Schema;
|
||||
use yii\db\Migration;
|
||||
|
||||
class m150101_185401_create_news_table extends Migration
|
||||
{
|
||||
public function up()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function down()
|
||||
{
|
||||
echo "m101129_185401_create_news_table cannot be reverted.\n";
|
||||
|
||||
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`:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use yii\db\Schema;
|
||||
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()
|
||||
{
|
||||
@ -95,11 +111,10 @@ class m150101_185401_create_news_table extends \yii\db\Migration
|
||||
{
|
||||
$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).
|
||||
|
||||
@ -111,7 +126,36 @@ class m150101_185401_create_news_table extends \yii\db\Migration
|
||||
|
||||
Вы можете добавить дополнительные ограничения при использовании абстрактных типов. В приведенном выше примере, ` 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>
|
||||
|
||||
@ -122,8 +166,8 @@ class m150101_185401_create_news_table extends \yii\db\Migration
|
||||
В следующем примере, помимо создания таблицы `news` мы также вставляем в этой таблице начальную строку.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use yii\db\Schema;
|
||||
use yii\db\Migration;
|
||||
|
||||
class m150101_185401_create_news_table extends Migration
|
||||
@ -131,11 +175,11 @@ class m150101_185401_create_news_table extends Migration
|
||||
public function safeUp()
|
||||
{
|
||||
$this->createTable('news', [
|
||||
'id' => 'pk',
|
||||
'title' => Schema::TYPE_STRING . ' NOT NULL',
|
||||
'content' => Schema::TYPE_TEXT,
|
||||
'id' => $this->primaryKey(),
|
||||
'title' => $this->string()->notNull(),
|
||||
'content' => $this->text(),
|
||||
]);
|
||||
|
||||
|
||||
$this->insert('news', [
|
||||
'title' => 'test 1',
|
||||
'content' => 'content 1',
|
||||
@ -184,7 +228,10 @@ class m150101_185401_create_news_table extends Migration
|
||||
* [[yii\db\Migration::createIndex()|createIndex()]]: создание индекса
|
||||
* [[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>
|
||||
|
||||
@ -327,7 +374,8 @@ yii migrate --db=db2
|
||||
Иногда может случиться так, что Вы захотите применить *некоторые* из миграций к одной базе данных, а некоторые другие к другой базе данных. Для достижения этой цели, при реализации класса миграции, необходимо явно указать идентификатор ID компонента базы данных, который миграция будет использовать, следующим образом:
|
||||
|
||||
```php
|
||||
use yii\db\Schema;
|
||||
<?php
|
||||
|
||||
use yii\db\Migration;
|
||||
|
||||
class m150101_185401_create_news_table extends Migration
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
====================
|
||||
|
||||
Построенный поверх [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\QueryBuilder]] это класс отвечающий за генерацию зависимого
|
||||
неявно при вызове одного из методов запроса. [[yii\db\QueryBuilder]] это класс, отвечающий за генерацию зависимого
|
||||
от СУБД SQL выражения (такие как экранирование имён таблиц/столбцов) из независимых от СУБД объектов [[yii\db\Query]].
|
||||
|
||||
|
||||
@ -58,7 +58,7 @@ $query->select(['id', 'email']);
|
||||
$query->select('id, email');
|
||||
```
|
||||
|
||||
Имена столбцов могут быть выбраны вместе с префиксами таблиц и/или алиасами столбцов, также как при записи обычного SQL.
|
||||
Имена столбцов могут быть выбраны вместе с префиксами таблиц и/или алиасами столбцов, также как при записи обычного SQL выражения.
|
||||
Например,
|
||||
|
||||
```php
|
||||
@ -80,14 +80,14 @@ $query->select(['user_id' => 'user.id', 'email']);
|
||||
выбрать *все* столбцы.
|
||||
|
||||
Кроме имён столбцов, вы можете также использовать SQL выражения. Вы должны использовать формат массива для использования
|
||||
выражений, которые содержат запятые для предотвращения некорректного автоматического экранирования. Например:
|
||||
выражений, которые содержат запятые для предотвращения некорректного автоматического экранирования. Например,
|
||||
|
||||
```php
|
||||
$query->select(["CONCAT(first_name, ' ', last_name) AS full_name", 'email']);
|
||||
```
|
||||
|
||||
Начиная с версии 2.0.1, вы также можете использовать подзапросы. Вы должны указывать каждый подзапрос в выражении как
|
||||
объект [[yii\db\Query]]. Например:
|
||||
объект [[yii\db\Query]]. Например,
|
||||
|
||||
```php
|
||||
$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();
|
||||
```
|
||||
|
||||
Вы можете вызвать [[yii\db\Query::addSelect()|addSelect()]] для добавления полей. Например:
|
||||
Вы можете вызвать [[yii\db\Query::addSelect()|addSelect()]] для добавления полей. Например,
|
||||
|
||||
```php
|
||||
$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()]] указывает фрагмент `FROM` SQL запроса. Например:
|
||||
Метод [[yii\db\Query::from()|from()]] указывает фрагмент `FROM` SQL запроса. Например,
|
||||
|
||||
```php
|
||||
// SELECT * FROM `user`
|
||||
@ -121,7 +121,7 @@ $query->from('user');
|
||||
```
|
||||
|
||||
Вы можете указать имена таблиц в виде строки или массива. Имена таблиц могут содержать префикс схемы и/или алиасы
|
||||
таблиц, как при написании обычного SQL. Например:
|
||||
таблиц, как при написании обычного SQL выражения. Например,
|
||||
|
||||
```php
|
||||
$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']);
|
||||
```
|
||||
|
||||
Кроме имён таблиц, вы можете, также как и в select, указывать подзапросы в виде объекта [[yii\db\Query]].
|
||||
Кроме имён таблиц, вы можете, также, как и в select, указывать подзапросы в виде объекта [[yii\db\Query]].
|
||||
|
||||
```php
|
||||
$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 выражения. Вы можете использовать один из
|
||||
трёх форматов:
|
||||
|
||||
- строковый формат, например: `'status=1'`
|
||||
- формат массива, например: `['status' => 1, 'type' => 2]`
|
||||
- формат операторов, например: `['like', 'name', 'test']`
|
||||
- строковый формат, Например, `'status=1'`
|
||||
- формат массива, Например, `['status' => 1, 'type' => 2]`
|
||||
- формат операторов, Например, `['like', 'name', 'test']`
|
||||
|
||||
|
||||
#### Строковый формат <span id="string-format"></span>
|
||||
|
||||
Строковый формат - это лучший выбор для простых условий. Он работает так, будто вы просто пишете SQL запрос. Например:
|
||||
Строковый формат - это лучший выбор для простых условий. Он работает так, будто вы просто пишете SQL запрос. Например,
|
||||
|
||||
```php
|
||||
$query->where('status=1');
|
||||
@ -281,7 +281,7 @@ $query->where(['id' => $userQuery]);
|
||||
|
||||
Вы можете использовать [[yii\db\Query::andWhere()|andWhere()]] или [[yii\db\Query::orWhere()|orWhere()]] для добавления
|
||||
дополнительных условий. Вы можете использовать эти вызовы несколько раз для добавления нескольких условий.
|
||||
Например:
|
||||
Например,
|
||||
|
||||
```php
|
||||
$status = 10;
|
||||
@ -317,7 +317,7 @@ $query->filterWhere([
|
||||
```
|
||||
|
||||
Единственное отличие между [[yii\db\Query::filterWhere()|filterWhere()]] и [[yii\db\Query::where()|where()]]
|
||||
заключается в игнорировании пустых значений переданных в условие в [форме массива](#hash-format). Таким образом
|
||||
заключается в игнорировании пустых значений, переданных в условие в [форме массива](#hash-format). Таким образом
|
||||
если `$email` будет пустым, а `$username` нет, то приведённый выше код сформирует `...WHERE username=:username`.
|
||||
|
||||
> Информация: значение признаётся пустым, если это null, пустой массив, пустая строка или строка состоящая из одних пробельных символов.
|
||||
@ -339,7 +339,7 @@ $query->orderBy([
|
||||
]);
|
||||
```
|
||||
|
||||
В данном коде, ключи массива это имена столбцов, а значения массива это соответствующее направление сортировки.
|
||||
В данном коде, ключи массива - это имена столбцов, а значения массива - это соответствующее направление сортировки.
|
||||
PHP константа `SORT_ASC` определяет сортировку по возрастанию и `SORT_DESC` сортировка по умолчанию.
|
||||
|
||||
Если `ORDER BY` содержит только простые имена столбцов, вы можете определить их с помощью столбцов, также
|
||||
@ -369,7 +369,7 @@ $query->groupBy(['id', 'status']);
|
||||
```
|
||||
|
||||
Если фрагмент `GROUP BY` содержит только простые имена столбцов, вы можете указать их используя строку, также как в
|
||||
обычном SQL.
|
||||
обычном SQL выражении.
|
||||
|
||||
```php
|
||||
$query->groupBy('id, status');
|
||||
@ -501,7 +501,7 @@ $query1->union($query2);
|
||||
[[yii\db\Query::max()|max($q)]], [[yii\db\Query::min()|min($q)]]. Параметр `$q` обязателен для этих методов и могут
|
||||
содержать либо имя столбца, либо выражение БД.
|
||||
|
||||
Например:
|
||||
Например,
|
||||
|
||||
```php
|
||||
// SELECT `id`, `email` FROM `user`
|
||||
@ -520,7 +520,7 @@ $row = (new \yii\db\Query())
|
||||
> Примечание: метод [[yii\db\Query::one()|one()]] вернёт только первую строку результата запроса. Он НЕ добавляет
|
||||
`LIMIT 1` в генерируемый SQL. Это хорошо и предпочтительно если вы знаете, что запрос вернёт только одну или несколько
|
||||
строк данных (например, при запросе по первичному ключу). Однако, если запрос потенциально может вернут много
|
||||
строк данных, вы должны вызвать `limit(1)` для повышения производительности, Например:
|
||||
строк данных, вы должны вызвать `limit(1)` для повышения производительности, Например,
|
||||
`(new \yii\db\Query())->from('user')->limit(1)->one()`.
|
||||
|
||||
Все методы выборки могут получать необязательный параметр `$db`, представляющий [[yii\db\Connection|соединение с БД]],
|
||||
@ -566,7 +566,7 @@ $rows = $command->queryAll();
|
||||
### Индексация результатов запроса <span id="indexing-query-results"></span>
|
||||
|
||||
При вызове [[yii\db\Query::all()|all()]] возвращается массив строк индексированный последовательными целыми числами.
|
||||
Иногда вам может потребоваться индексировать его по другому, например сделать индекс по указанному столбцу или
|
||||
Иногда вам может потребоваться индексировать его по-другому, например, сделать индекс по указанному столбцу или
|
||||
значением выражения. Вы можете реализовать такое поведение через вызов [[yii\db\Query::indexBy()|indexBy()]] перед
|
||||
вызовом [[yii\db\Query::all()|all()]].
|
||||
|
||||
|
||||
Reference in New Issue
Block a user