Всем здрасти!
Немного подробностей:
Имеем большое количество материалов (нод), необходимо в зависимости от условий выводить их на страницу в ноде родителе.
Пример, есть нода "проект" в ней много связанных нод "задач". У проекта несколько режимов отображения, и для каждого режима задачи выводятся в определенном режиме отображения.
Т.е. при переходе по адресу /проект/режим 1 - выводим задачи в режиме дисплей 1
при переходе по адресу /проект/режим 2 - выводим задачи в режиме дисплей 2 и т.д.
Соответственно, при загрузке страницы /проект/режим 1 выполняется запрос в БД и производится выборка нод-задач, при загрузке страницы /проект/режим 2 выполняется абсолютно такой же запрос в БД. Различия лишь в режиме отображения.
Вот и возник ряд вопросов:
1. Как можно уменьшить обращения к БД?
Можно ли например записать выборку куда нибудь в сессию (кэш?) и обращаться к данным, пока например что нибудь не изменится? Никогда раньше с таким не сталкивался.
2. Что лучше использовать при загрузке нод EFQ или Views? -- Этот вопрос меня вообще давно интересует)
Например, на одну страницу выводим вьюхой ноды в режиме teaser и затем эти же ноды выводим в режиме teaser2, т.е. получается что условия выборки почти одинаковые, не совсем конечно, но!
Поподробней:
Необходимо это - когда надо показать задачи с разными статусами (например - готово, в работе, подготовка и т.д.).
При выводе вьюхой получается что то в этом роде:
{{ 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) {
//Тут делим их по статусам и раскладываем по массивам
}
}
?>
Ну и дальше выводим их в темплейте.
Вообще, оба метода отрабатывают одинаково (визуально ), терзают сомнения, вьюха наверняка дружит с кэшем и как то его использует), с другой стороны метод с EFQ более гибкий и точно один запрос. Что скажете?
P.S. Ответ на первый вопрос более актуален)) Второй, скорее, чтобы точки над и расставить))
Комментарии
Нашел свой же вопрос на тему EFQ vs Views , но тему так и не раскрыли так что пока актуально
Только теория, и ничего более.
Рассмотрим вариант с views - кеш на основе тегов. Это такой кеш, когда views знает что контент поменялся и надо запрос сделать.
Как это вывести кодом и блоком? Вам придется проверять , например дату обновления и на основе суммы хеша дат обновления и обновлять кеш.
Так что как ни крути, views проще и быстрее и гибче.
У views очень хорошо настроено кеширование. Если сможете реализовать подобное в своем модуле с EFQ - будет не хуже чем views.
Во views есть группировка, и вам не нужно 3 view чтобы вывести 3 разных статуса.