Выборка сущностей, views или EFQ?

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

Аватар пользователя buddy90210 buddy90210 9 июня 2020 в 19:52

Доброго времени суток!
Возник такой вопрос, сначала суть:
Задача - есть два типа материала "Этап" и "Работа". К каждому "Этапу" может относиться бесконечное количество "Работ". Необходимо вывести в виде таблицы все "Этапы" с "Работами", в такой структуре:
Этап 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;
?>

И в шаблоне проверяю, чтобы "работа" соответствовала своему "Этапу" -

{% if stages is not empty %}
        {% for stage in stages %}
                {{ stage.out }}
                {% if jobs is not empty %}
                        {% for job in jobs %}
                                {% if stage.key == job.key %}
                                        {{job.out}}
                                {% endif %}
                        {% endfor %}
                {% endif %}
        {% endfor %}
{% endif %}

Замечательно работают оба метода.
Собственно вопрос - если будет очень много материалов, в первом варианте представлений на странице будет очень много, т.е. общее и в каждом "этапе" со связанными "работами", как я понимаю будет выполнено столько же запросов к БД сколько и представлений? Т.е. этод вариант будет больше нагружать БД?
Что касается второго варианта, запрос к БД выполняется один (как кажется мне)), но логика вывода определяется в шаблоне TWIG, как он будет работать с большими массивами?
Итог: Как правильней выполнять подобные задачи, для большого количества материалов? Может вариант с представлениями не так уж и плох, удобней точно.

Комментарии

Аватар пользователя marassa marassa 9 июня 2020 в 20:39

Да вообще ничего этого не нужно. Строится view по Работам, добавляется поле Этап, в настройках формата view в самом первом поле Grouping field #1 выбирается Этап. Сортировку еще добавить по Этапам, ну и дальше соль-сахар-перец по вкусу.

Аватар пользователя buddy90210 buddy90210 9 июня 2020 в 21:03

Разобрался, спасибо, как то никогда раньше не пользовался данным функционалом)
Правда данный функционал не совсем подходит, так как вывести необходимо так же и сущность "этап", и тогда группировка выполняется и для сущности "этап", т.е. работы сгруппировались по этапам как и надо, а этапы сами с собой, так как у них нет поля ID этапа.

Аватар пользователя marassa marassa 9 июня 2020 в 21:16

buddy90210 wrote: вывести необходимо так же и сущность "этап"

Ее можно вывести, отформатировав поле Этап как Rendered entity.