|
|
|
@ -1,7 +1,7 @@
|
|
|
|
|
Построитель запросов |
|
|
|
|
==================== |
|
|
|
|
|
|
|
|
|
Построеный поверх [DAO](db-dao.md), построитель запросов позволяет конструировать SQL выражения в программируемом и |
|
|
|
|
Построенный поверх [DAO](db-dao.md), построитель запросов позволяет конструировать SQL выражения в программируемом и |
|
|
|
|
независимом от СУБД виде. В сравнении с написанием чистого SQL, использование построителя помогает вам писать |
|
|
|
|
более читаемый связанный с SQL код и генерировать более безопасные SQL выражения. |
|
|
|
|
|
|
|
|
@ -86,7 +86,7 @@ $query->select(['user_id' => 'user.id', 'email']);
|
|
|
|
|
$query->select(["CONCAT(first_name, ' ', last_name) AS full_name", 'email']); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
Начиная с версии 2.0.1, вы также можете использовать подзапросы. Вы должны указывть каждый подзапрос в выражении как |
|
|
|
|
Начиная с версии 2.0.1, вы также можете использовать подзапросы. Вы должны указывать каждый подзапрос в выражении как |
|
|
|
|
объект [[yii\db\Query]]. Например: |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
@ -169,7 +169,7 @@ $query->where('status=:status', [':status' => $status]);
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
Не встраивайте переменные непосредственно в условие, особенно если значение переменной получено от пользователя, |
|
|
|
|
потому что это делает ваше приложение подверженым атакам через SQL инъекции. |
|
|
|
|
потому что это делает ваше приложение подверженным атакам через SQL инъекции. |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
// Опасность! Не делайте так если вы не уверены, что $status это действительно число. |
|
|
|
@ -200,7 +200,7 @@ $query->where([
|
|
|
|
|
]); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
Как вы можете видеть, построитель запросов достаточно умён, чтобы правильно обрабатывать значения NULL или массивов. |
|
|
|
|
Как вы можете видеть, построитель запросов достаточно умен, чтобы правильно обрабатывать значения NULL или массивов. |
|
|
|
|
|
|
|
|
|
Вы также можете использовать подзапросы: |
|
|
|
|
|
|
|
|
@ -303,9 +303,9 @@ if (!empty($search)) {
|
|
|
|
|
|
|
|
|
|
#### Условия для фильтров <span id="filter-conditions"></span> |
|
|
|
|
|
|
|
|
|
Когда условие `WHERE` формируется на основе пользовательского ввода, обычно хочется проигнорироват незаданные значения. |
|
|
|
|
Когда условие `WHERE` формируется на основе пользовательского ввода, обычно хочется проигнорировать не заданные значения. |
|
|
|
|
Например, в форме поиска, которая позволяет осуществлять поиск по имени пользователя или email, вы хотели бы игнорировать |
|
|
|
|
username/email условие, если пользователь ничего не ввёл в поле ввода. Вы можете достич этого используя метод |
|
|
|
|
username/email условие, если пользователь ничего не ввёл в поле ввода. Вы можете достичь этого используя метод |
|
|
|
|
[[yii\db\Query::filterWhere()|filterWhere()]]. |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
@ -316,13 +316,13 @@ $query->filterWhere([
|
|
|
|
|
]); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
Единственное отличие межде [[yii\db\Query::filterWhere()|filterWhere()]] и [[yii\db\Query::where()|where()]] |
|
|
|
|
Единственное отличие между [[yii\db\Query::filterWhere()|filterWhere()]] и [[yii\db\Query::where()|where()]] |
|
|
|
|
заключается в игнорировании пустых значений переданных в условие в [форме массива](#hash-format). Таким образом |
|
|
|
|
если `$email` будет пустым, а `$username` нет, то приведённый выше код сформирует `...WHERE username=:username`. |
|
|
|
|
|
|
|
|
|
> Информация: значение признаётся пустым, если это null, пустой массив, пустая строка или строка состоящая из одних пробельных символов. |
|
|
|
|
|
|
|
|
|
Таже вместо [[yii\db\Query::andWhere()|andWhere()]] и [[yii\db\Query::orWhere()|orWhere()]], вы можете использовать |
|
|
|
|
Также вместо [[yii\db\Query::andWhere()|andWhere()]] и [[yii\db\Query::orWhere()|orWhere()]], вы можете использовать |
|
|
|
|
[[yii\db\Query::andFilterWhere()|andFilterWhere()]] и [[yii\db\Query::orFilterWhere()|orFilterWhere()]] |
|
|
|
|
для добавления дополнительных условий фильтрации. |
|
|
|
|
|
|
|
|
@ -421,7 +421,7 @@ $query->limit(10)->offset(20);
|
|
|
|
|
Если вы определяете неправильный limit или offset (например отрицательное значение), они будут проигнорированы. |
|
|
|
|
|
|
|
|
|
> Информация: Для СУБД, которые не поддерживают `LIMIT` и `OFFSET` (такие как MSSQL), построитель запросов будет |
|
|
|
|
генерировать SQL выражения, которые эмулируют поведение `LIMIT`/`OFFSET`. |
|
|
|
|
генерировать SQL выражения, которые эмулирует поведение `LIMIT`/`OFFSET`. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### [[yii\db\Query::join()|join()]] <span id="join"></span> |
|
|
|
@ -491,7 +491,7 @@ $query1->union($query2);
|
|
|
|
|
|
|
|
|
|
[[yii\db\Query]] предоставляет целый набор методов для разных вариантов выборки: |
|
|
|
|
|
|
|
|
|
- [[yii\db\Query::all()|all()]]: возвращает массив строк, какждая из которых это ассоциативный массив пар ключ-значение. |
|
|
|
|
- [[yii\db\Query::all()|all()]]: возвращает массив строк, каждая из которых это ассоциативный массив пар ключ-значение. |
|
|
|
|
- [[yii\db\Query::one()|one()]]: возвращает первую строку запроса. |
|
|
|
|
- [[yii\db\Query::column()|column()]]: возвращает первый столбец результата. |
|
|
|
|
- [[yii\db\Query::scalar()|scalar()]]: возвращает скалярное значение первого столбца первой строки результата. |
|
|
|
@ -518,7 +518,7 @@ $row = (new \yii\db\Query())
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
> Примечание: метод [[yii\db\Query::one()|one()]] вернёт только первую строку результата запроса. Он НЕ добавляет |
|
|
|
|
`LIMIT 1` в генерируемый SQL. Это хорошо и предпочтительно если вы знаете, что запрос вернёт только одны или несколько |
|
|
|
|
`LIMIT 1` в генерируемый SQL. Это хорошо и предпочтительно если вы знаете, что запрос вернёт только одну или несколько |
|
|
|
|
строк данных (например, при запросе по первичному ключу). Однако, если запрос потенциально может вернут много |
|
|
|
|
строк данных, вы должны вызвать `limit(1)` для повышения производительности, Например: |
|
|
|
|
`(new \yii\db\Query())->from('user')->limit(1)->one()`. |
|
|
|
@ -542,7 +542,7 @@ $count = (new \yii\db\Query())
|
|
|
|
|
* Создаёт объект [[yii\db\Command]] с сгенерированным SQL запросом; |
|
|
|
|
* Вызывается выбирающий метод (например `queryAll()`) из [[yii\db\Command]] для выполнения SQL запроса и извлечения данных. |
|
|
|
|
|
|
|
|
|
Иногда вы можете захотеть увидеть или испрользовать SQL запрос построенный из объекта [[yii\db\Query]]. Этой цели можно |
|
|
|
|
Иногда вы можете захотеть увидеть или использовать SQL запрос построенный из объекта [[yii\db\Query]]. Этой цели можно |
|
|
|
|
добиться с помощью следующего кода: |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|