Skip to content

Переписал статью с построителем запроса - #125

Open
gromdron wants to merge 3 commits into
bitrix-tools:mainfrom
gromdron:query_builder
Open

gromdron wants to merge 3 commits into
bitrix-tools:mainfrom
gromdron:query_builder

Conversation

@gromdron

@gromdron gromdron commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Я посмотрел последний PR с изменением namespace и мне показалось важным дополнить эту статью с актуальными примерами и показать что это немного больше чем просто Query объект и он не такой уж сложный - нет необходимости в оборачивании Datamanager-наследника.

@ech-bitrix-doc
ech-bitrix-doc requested review from ech-bitrix-doc and removed request for ech-bitrix-doc September 10, 2026 08:12

@ech-bitrix-doc ech-bitrix-doc left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добрый день!

Спасибо за PR. Статья требовала переработки, и направление мы забираем почти целиком.

Что пригодилось:

  • переход с new Query(BookTable::getEntity()) на BookTable::query() — обоснование через getQueryClass() корректное, проверила по ядру;
  • сравнение трёх подходов к записи одного запроса;
  • разбивка на ### вместо жирных псевдозаголовков — разделы попадут в оглавление страницы;
  • примеры к группам методов вместо голого перечня;
  • исправленная дата в SQL-комментарии — эта опечатка жила в статье давно.

Оставила 13 замечаний по строкам. Блокирующих пять: три фактические ошибки (поля объекта, имя таблицы, результат hasDistinct) и две по разметке, которые могут сломать вёрстку (вкладки и тип плашки note).

Ориентиры: правила оформления примеров кода — в CONTRIBUTING.md, образец оформления статьи для этого раздела — соседняя pages/orm/querying-data.md. Она задаёт вид списков, заголовков, подводок и плашек.

В двух комментариях (строки 55 и 240) я сразу дала готовый текст со ссылками на исходники: там нужна сверка с ядром, и проверять это вам не нужно.

Comment thread pages/orm/query-builder.md Outdated
Comment thread pages/orm/query-builder.md Outdated
Comment thread pages/orm/query-builder.md Outdated
Comment thread pages/orm/query-builder.md Outdated
Comment thread pages/orm/query-builder.md Outdated
Comment thread pages/orm/query-builder.md
Comment thread pages/orm/query-builder.md Outdated
Comment thread pages/orm/query-builder.md Outdated
Comment thread pages/orm/query-builder.md Outdated
Comment thread pages/orm/query-builder.md Outdated
@gromdron

Copy link
Copy Markdown
Contributor Author

Спасибо за ревью - достаточно подробно и информативно получилось.

Действительно, многие фрагменты нуждались в переработке и упрощении текста, поэтому я пошел еще чуть дальше - прогнал скилом от "Пиши сокращай" чтобы улучшить результат.

@ech-bitrix-doc ech-bitrix-doc left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо, большую часть правок применили точно.

Отдельно про прогон через «Пиши, сокращай» — он реально пошёл статье на пользу, и в нескольких местах ваш вариант лучше моего. Возвращать мои формулировки не надо

Оставшиеся пункты указаны в комментариях

Если параметры запроса формируются программно, используйте построитель запросов объект `Bitrix\Main\ORM\Query\Query`. Построитель накапливает параметры и выполняет запрос по вызову метода `exec`.

Пример с `getList`
Сравните три способа собрать один и тот же запрос на получение книги по идентификатору. Все примеры статьи используют класс `BookTable` — его описание смотрите в статье [Операции с сущностями](./entity-operations.md).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Якорь потерялся. В entity-operations.md:445 есть заголовок ## Пример класса BookTable {#booktable-example} — ссылка должна вести на него, а не на статью целиком.

Замените строку на:

Сравните три способа собрать один и тот же запрос на получение книги по идентификатору. Все примеры статьи используют объект BookTable — его класс целиком смотрите в статье Операции с сущностями.


Создавайте объект `Query` методом `query()` нужной таблицы, а не через `new Query()`. Метод `query()` возвращает класс запроса, указанный в методе `getQueryClass()` таблицы. Например, модуль информационных блоков подставляет свой класс запроса. Вызов `new Query()` всегда создает базовый класс, поэтому доработки таблицы теряются.

{% endnote %}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

После плашки потерялся факт, который был в статье до PR — в main это строка 32: переопределение getList работает не всегда. Плашке он не противоречит, а дополняет ее.

Добавьте абзац после {% endnote %}:

Переопределенный метод getList срабатывает не всегда. Если запрос собирают через объект Query и выполняют методом exec, вызова getList не происходит и переопределение не применяется.

Comment on lines +125 to +129
- `set` заменяет ранее заданное значение.

- Условие внутри функции добавляет поле `ISBN`, если оно необходимо
- `add` дополняет его.

**Добавление фильтров и сортировки**. Функция `attachOthers` добавляет фильтры и сортировку.
- `get` возвращает текущее значение.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Маркеры списков идут с одним пробелом. В разделе принято два

Поправьте во всех 17 пунктах: строки 125, 127, 129, 139, 141, 143, 174, 176, 199, 201, 203, 242, 244, 246, 262, 264, 283.

Suggested change
- `set` заменяет ранее заданное значение.
- Условие внутри функции добавляет поле `ISBN`, если оно необходимо
- `add` дополняет его.
**Добавление фильтров и сортировки**. Функция `attachOthers` добавляет фильтры и сортировку.
- `get` возвращает текущее значение.
- `set` заменяет ранее заданное значение.
- `add` дополняет его.
- `get` возвращает текущее значение.

$sql = $q->getQuery();
file_put_contents('/tmp/today_books.sql', $sql);
// Запрос "SELECT ID FROM my_book WHERE PUBLISH_DATE='2014-12-31'" будет сохранен в файл, но не выполнен.
Чтобы посчитать книги по датам выхода, добавьте группировку. Поле `CNT` описывает объект `ExpressionField` — о таких полях рассказывает раздел [Runtime-поля](#runtime-polya).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ссылка не разрешится. Якорь генерируется из заголовка и кириллицу сохраняет, а явного {#runtime-polya} у заголовка нет. Проверить можно по focus-monitor.md:39 — там ссылка #включить-логирование ведет на заголовок ## Включить логирование без явного якоря.

Нужно либо [Runtime-поля](#runtime-поля), либо задать заголовку явный якорь: ### Runtime-поля {#runtime-fields} и ссылку на #runtime-fields.

@@ -71,73 +97,223 @@ function attachOthers(Query $query): void
}
```

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Замечание было про первое лицо и точки в пунктах, а не про то, что разбор примера лишний. Сейчас блок кода со строк 64–98 остался без пояснения.

Замените строку на:

Создание объекта Query. Метод BookTable::query() создает объект Query, связанный с таблицей книг. Объект становится основой для построения запроса.

Добавление полей в запрос. Функция attachSelect добавляет поля, которые нужно выбрать из базы данных.

  • addSelect('ID') добавляет поле ID в список выбираемых полей.

  • Условие внутри функции добавляет поле ISBN, если оно необходимо.

Добавление фильтров и сортировки. Функция attachOthers добавляет фильтры и сортировку.

  • setFilter устанавливает условия фильтрации данных.

  • setOrder задает порядок сортировки результатов.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants