Как загрузить модели без связанных объектов? - PullRequest
0 голосов
/ 07 января 2019

Я получаю список объектов модели из объекта репозитория с обычным кодом, подобным этому:

...
$query = $this->createQuery();
$query->getQuerySettings()->setStoragePageIds($projectStoragePids);
...
$query->matching($query->logicalOr($constraints));
$result = $query->execute();

Теперь, если я отлаживаю объекты, я вижу, что все связанные элементы сложных объектов также были загружены, а также связанные с ними объекты и так далее. Таким образом, хранилище предоставляет огромное дерево, а мне просто нужен сам список объектов без глубины. Члены сложного объекта могут быть просто NULL. Поэтому создание списка слишком медленное и ненужное.

Мне известно о @lazy, однако оно не изменится, если я установлю этот атрибут в модели (и очисту кеш).

Какие есть варианты отключения глубокой загрузки связанных объектов, кроме @lazy? Какой автоматизм заставляет обработчик домена TYPO3 загружать или пропускать связанные объекты?

В C # вы можете выбрать .include(). А как насчет TYPO3?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Попробуйте $query->execute(1);. Это флаг rawResult, который возвращает строку необработанной базы данных в виде массива, а не объекта. Отношения с другими объектами также не разрешены.

0 голосов
/ 16 января 2019

Важно отметить, что вы можете использовать $query->statement($sql, $params).

Это один из самых популярных методов запроса: http://lbrmedia.net/codebase/Eintrag/extbase-query-methods/

Если вы используете это, вы можете написать оператор select, который включает в себя только выбор полей. Построитель объектов модели T3 возьмет выбранные вами строки и поля и создаст объекты модели на основе доступной информации.

Так, например, предположим, что мы сначала пишем:

...
$query = $this->createQuery();  
$result = $query->execute();
return $result;

Таким образом, вы получите список объектов с каждым полем члена объекта, также инициализированным с полным объектом.

Но если мы напишем, например:

$query = $this->createQuery();
$query->statement('select uid from tx_my_table'); // <<<<<<<<  
$result = $query->execute();
return $result;

Тогда вы все равно получите список объектов, , но единственное поле-член, имеющее реальное значение, - uid. Таким образом, вы также можете выбрать поле, которое указывает на некоторые отношения m: m. Это будет обработано.

Это может принести огромный прирост скорости.

Предостережение в том, что репозиторий extbase T3 каким-то образом слегка создает смесь между вашим чистым sql и некоторыми внутренними спецификациями. Я полагаю, что некоторые дополнительные подсказки могут быть найдены поиском TYPO3 convertQueryToDoctrineQueryBuilder. Кроме того, вы должны переписать свои собственные ограничения запросов, которые обычно задаются $querySettings. Но, эй, это открытая дверь для оптимизации.

...