[ЛЮБОПЫТНО] Вопрос оптимизации

Привет, комрады, вопрос к опытным разработчикам. Есть страница, на ней много блоков которые показывают информацию из различных ресурсов, похоже на превью товаров в каталоге. Соответственно если нужно отобразить 2, 3 или больше таких превью я использую pdoResources, но как лучше сделать, с точки зрения оптимизации, если превью одна:
1. вызывать pdoResources
2. доставать каждое поле через fastfields или его аналог на Fenom
{$id | resource: 'pagetitle'}
Артур
10 декабря 2020, 18:32
modx.pro
391
0
Поблагодарить автора Отправить деньги

Комментарии: 5

Alexey
11 декабря 2020, 10:32
+1
Привет! Ради эксперимента поставил debugParser

Вариант 1
{1 | resource : 'pagetitle'}
{1 | resource : 'catalog_img'}

skrinshoter.ru/s/111220/mspCPgvc?a

Вариант 2
{'pdoResources' | snippet : [
    'parents' => 0,
    'resources' => 1,
    'includeTVs' => 'catalog_img',
    'tpl' => '@INLINE {$pagetitle} - {$_pls[\'tv.catalog_img\']}'
]}

skrinshoter.ru/s/111220/bSRcK8bV?a

Короче, я бы вообще не заморачивался с этим, разница минимальная))
    Артур
    11 декабря 2020, 11:46
    0
    Спасибо, что заморочился)))
      Артур
      11 декабря 2020, 11:48
      0
      Но я удивлен, почему-то думал что всё тащится в один запрос, а там 4-5
        Alexey
        11 декабря 2020, 13:06
        0
        Вот тут точно один запрос будет)) Возвращает массив необходимых полей для одной превьюшки.

        if(!$res_id) return;
        
        $q = $modx->newQuery('modResource');
        if($id_tv) {
            $q->leftJoin('modTemplateVarResource', 'image', 'modResource.id = image.contentid AND image.tmplvarid = '.$id_tv);
        }
        $q->where([
            'modResource.id' => $res_id
        ]);
        $q->limit(1);
        if($id_tv) {
            $q->select('modResource.id, image.value as image, modResource.uri as uri, modResource.pagetitle as pagetitle');
        } else {
            $q->select('modResource.id, modResource.uri as uri, modResource.pagetitle as pagetitle');
        }
        
        $q->prepare();
        $q->stmt->execute();
        $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
        
        return $result[0];

        А в pdoField есть набор параметров, я не смотрел сам код сниппета, но, полагаю, что по ним есть дополнительные запросы в БД. Например, запрос текущего контекста, если явно не указан параметр context при вызове сниппета.
          Артур
          11 декабря 2020, 13:13
          0
          Понял, спасибо,
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    5