Доброго времени суток!
Возник такой вопрос, сначала суть:
Задача - есть два типа материала "Этап" и "Работа". К каждому "Этапу" может относиться бесконечное количество "Работ". Необходимо вывести в виде таблицы все "Этапы" с "Работами", в такой структуре:
Этап 1
-Работа 1
-Работа 2
Этап 2
-Работа 3
-Работа 4
В голову пришло два варианта реализации:
1. Вывожу все "Этапы" Представлением, как сущности, в TWIG шаблоне "Этапа" вывожу еще одно Представление которое выводит связанные "Работы".
2. В препроцессе необходимой страницы, делаю выборку из базы необходимых материалов -
<?php
$query = \Drupal::entityQuery('node');
$query->condition('status', 1);
$query->condition('field_project_id', $id);
$or = $query->orConditionGroup();
$or->condition('type', 'project_stage');
$or->condition('type', 'project_job');
$query->condition($or);
$query->sort('nid' , 'ASC');
$entity_ids = $query->execute();?>
Далее, создаю два массива -
<?php
if ($type == 'project_stage') {
$key = $id;
$stages[] = array('key'=>$key,'out'=>$output);
} else {
$key = $node->get('field_project_stage_id')->getValue()[0]['value'];
$jobs[] = array('key'=>$key,'out'=>$output);
}
$vars['jobs'] = $jobs;
$vars['stages'] = $stages;
?>
И в шаблоне проверяю, чтобы "работа" соответствовала своему "Этапу" -
Замечательно работают оба метода.
Собственно вопрос - если будет очень много материалов, в первом варианте представлений на странице будет очень много, т.е. общее и в каждом "этапе" со связанными "работами", как я понимаю будет выполнено столько же запросов к БД сколько и представлений? Т.е. этод вариант будет больше нагружать БД?
Что касается второго варианта, запрос к БД выполняется один (как кажется мне)), но логика вывода определяется в шаблоне TWIG, как он будет работать с большими массивами?
Итог: Как правильней выполнять подобные задачи, для большого количества материалов? Может вариант с представлениями не так уж и плох, удобней точно.
Комментарии
Тут не нужен ни twig, ни PHP. Всё прекрасно накликивается в админке вьюсов через Grouping field.
А можно чуть подробней, в двух словах, это через связи или есть спец поле для этих нужд?
Да вообще ничего этого не нужно. Строится view по Работам, добавляется поле Этап, в настройках формата view в самом первом поле Grouping field #1 выбирается Этап. Сортировку еще добавить по Этапам, ну и дальше соль-сахар-перец по вкусу.
Разобрался, спасибо, как то никогда раньше не пользовался данным функционалом)
Правда данный функционал не совсем подходит, так как вывести необходимо так же и сущность "этап", и тогда группировка выполняется и для сущности "этап", т.е. работы сгруппировались по этапам как и надо, а этапы сами с собой, так как у них нет поля ID этапа.
Ее можно вывести, отформатировав поле Этап как Rendered entity.