EFQ (Entity Field Query), Views и производительность.

Аватар пользователя buddy90210 buddy90210 15 февраля в 18:42

Всем здрасти!
Немного подробностей:
Имеем большое количество материалов (нод), необходимо в зависимости от условий выводить их на страницу в ноде родителе.
Пример, есть нода "проект" в ней много связанных нод "задач". У проекта несколько режимов отображения, и для каждого режима задачи выводятся в определенном режиме отображения.

Т.е. при переходе по адресу /проект/режим 1 - выводим задачи в режиме дисплей 1
при переходе по адресу /проект/режим 2 - выводим задачи в режиме дисплей 2 и т.д.

Соответственно, при загрузке страницы /проект/режим 1 выполняется запрос в БД и производится выборка нод-задач, при загрузке страницы /проект/режим 2 выполняется абсолютно такой же запрос в БД. Различия лишь в режиме отображения.

Вот и возник ряд вопросов:
1. Как можно уменьшить обращения к БД?
Можно ли например записать выборку куда нибудь в сессию (кэш?) и обращаться к данным, пока например что нибудь не изменится? Никогда раньше с таким не сталкивался.

2. Что лучше использовать при загрузке нод EFQ или Views? -- Этот вопрос меня вообще давно интересует)
Например, на одну страницу выводим вьюхой ноды в режиме teaser и затем эти же ноды выводим в режиме teaser2, т.е. получается что условия выборки почти одинаковые, не совсем конечно, но!
Поподробней:
Необходимо это - когда надо показать задачи с разными статусами (например - готово, в работе, подготовка и т.д.).
При выводе вьюхой получается что то в этом роде:

{{ drupal_view('machineName', 'block_1', $parent_id) }}
{{ drupal_view('machineName', 'block_2', $parent_id) }}
{{ drupal_view('machineName', 'block_3', $parent_id) }}

Как я понимаю, вьюха делает три запроса к БД (статусы ведь разные), это так?

При использовании EFQ:
Делаем выборку,

<?php
$query 
= \Drupal::entityQuery('node');
$query->condition('status'1);
$query->condition('field_parent_id'$parent_id);
$result $query->execute();
if (
$result) {
    
$items =  \Drupal\node\Entity\Node::loadMultiple($result);
    foreach (
$items as $item) {
        
//Тут делим их по статусам и раскладываем по массивам 
    
}
}
?>

Ну и дальше выводим их в темплейте.

Вообще, оба метода отрабатывают одинаково (визуально Smile ), терзают сомнения, вьюха наверняка дружит с кэшем и как то его использует), с другой стороны метод с EFQ более гибкий и точно один запрос. Что скажете?

P.S. Ответ на первый вопрос более актуален)) Второй, скорее, чтобы точки над и расставить))

Комментарии

Аватар пользователя buddy90210 buddy90210 15 февраля в 19:03

Нашел свой же вопрос на тему EFQ vs Views Biggrin , но тему так и не раскрыли так что пока актуально Wink

Аватар пользователя voviko voviko 16 февраля в 15:07

Только теория, и ничего более.
Рассмотрим вариант с views - кеш на основе тегов. Это такой кеш, когда views знает что контент поменялся и надо запрос сделать.

Как это вывести кодом и блоком? Вам придется проверять , например дату обновления и на основе суммы хеша дат обновления и обновлять кеш.

Так что как ни крути, views проще и быстрее и гибче.

Аватар пользователя Andruxa Andruxa 16 февраля в 15:32

Что лучше использовать при загрузке нод EFQ или Views?

У views очень хорошо настроено кеширование. Если сможете реализовать подобное в своем модуле с EFQ - будет не хуже чем views.

Аватар пользователя bsyomov bsyomov 16 февраля в 17:16

Во views есть группировка, и вам не нужно 3 view чтобы вывести 3 разных статуса. Smile