Как Views подгружает поля сущности из БД.

Главные вкладки

Аватар пользователя haver haver 5 сентября 2022 в 13:07

Смотрю как Views строит SQL запрос при выводе сущности, например ноды. Он запрашивает из базы только id сущности. Вопрос как он достает остальные поля? После получения массива с id сущностей делает повторные запросы через Field Query API?
Например запрос выглядит так:

SELECT "node_field_data"."nid" AS "nid"
FROM
{node_field_data} "node_field_data"

При добавлении в вьюху полей этот запрос не меняется.

Почему это делается именно так, в смысле почему все поля не берутся одним запросом? Запрос с большим количеством JOINов тяжелее чем несколько запросов? Или это делается в целях повышения читабельности кода избегают монструозных запросов.
При этом если по полю нужно делать фильтрацию или сортировку, тогда вьюс неизбежно джойнит таблицу этого поля из БД.
Хочу делать кое какой функционал в котором требуется достать данные из БД SQL запросом. И думаю как будет сделать это производительней и как "правильней".

Комментарии

Аватар пользователя OldWarrior OldWarrior 5 сентября 2022 в 14:56
2

Field Query API (или, если быть точным, EntityFieldQuery) упразднён начиная с Drupal 8.x. Используется ::entityQuery()

haver wrote: Вопрос как он достает остальные поля? ... Почему это делается именно так, в смысле почему все поля не берутся одним запросом?

Думаю, причина в универсальности. Результат - объект сущности ноды, который можно одновременно рендерить в разных режимах отображения без повторных запросов собственно нод.

---

haver wrote: При этом если по полю нужно делать фильтрацию или сортировку, тогда вьюс неизбежно джойнит таблицу этого поля из БД.

Это необходимо для правильных SQL-запросов.