php - Extbase 模型中的 Typo3 性能
问题描述
所以,我的 extbase 插件存在性能问题。场景是这样的:我有 4 个数据库表,其中包含艺术家、艺术品、展览和出版物的数据。展览可以有艺术家、艺术品和出版物作为mm关系。出版物和艺术品可以有艺术家作为mm的关系。在我的模型类中,我将这些关系作为 ObjectStorage 并为我的列表视图使用简单的 findAll() 方法。因此,如果我进入展览列表视图,我会得到每个展览及其相关艺术家以及该艺术家的所有相关艺术品/出版物/展览。性能真的很差,一个未缓存的页面几乎需要一整分钟才能加载。这完全是因为来自数据库的大量数据负载。我只需要第一层的MM关系,不需要更多。反正有配置这个吗?
类\域\模型\Exhibition.php
class Exhibition extends AbstractEntity
{
/**
* @var string
*/
protected $name = '';
/**
* @var string
*/
protected $location = '';
/**
* artists
*
* @var ObjectStorage<\Vendor\Project\Domain\Model\Artist>
* @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
*/
protected $artists = null;
/**
* artworks
*
* @var ObjectStorage<\Vendor\Project\Domain\Model\Artwork>
* @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
*/
protected $artworks;
/**
* publications
*
* @var ObjectStorage<\Vendor\Project\Domain\Model\Publication>
* @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
*/
protected $publications;
/**
* Fal media items
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference>
* @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
*/
protected $falMedia;
public function __construct(string $name = '', string $description = '', string $location = '')
{
$this->setName($name);
$this->setLocation($location);
}
/**
* @param string $name
*/
public function setName(string $name): void
{
$this->name = $name;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return string
*/
public function getLocation(): string
{
return $this->location;
}
/**
* @param string $location
*/
public function setLocation(string $location): void
{
$this->location = $location;
}
/**
* Returns the artist
*
* @return ObjectStorage<\Vendor\Project\Domain\Model\Artist> $artists
*/
public function getArtists()
{
return $this->artists;
}
/**
* Sets the artist
*
* @param ObjectStorage<\Vendor\GKG\Domain\Model\Artist> $artists
* @return void
*/
public function setArtists(ObjectStorage $artists)
{
$this->artists = $artists;
}
/**
* @param $artworks
*/
public function setArtworks($artworks)
{
$this->artworks = $artworks;
}
/**
* @return ObjectStorage
*/
public function getArtworks()
{
return $this->artworks;
}
/**
* Sets the publications
*
* @param ObjectStorage<\Vendor\Project\Domain\Model\Publication> $oublications
* @return void
*/
public function setPublications(ObjectStorage $publications)
{
$this->publications = $publications;
}
/**
* Returns the publications
*
* @return ObjectStorage<\Vendor\Project\Domain\Model\Publication> $publications
*/
public function getPublications()
{
return $this->publications;
}
/**
* Get the Fal media items
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage
*/
public function getFalMedia()
{
return $this->falMedia;
}
}
这将获取所有相关数据(艺术品、展览和出版物)的所有艺术家数据。这是一个重载:/
我尝试编写自己的查询,只在前端选择我需要的值: Classes\Domain\Repository\ExhibitionRepository.php
public function findExhibitions()
{
$languageAspect = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance
(\TYPO3\CMS\Core\Context\Context::class)->getAspect('language');
$sys_language_uid = $languageAspect->getId();
$query = $this->createQuery();
$query->getQuerySettings()->setRespectSysLanguage(true);
$query->statement( "
SELECT DISTINCT e.name, e.uid, e.location, e.fal_media, a.name, a.uid
FROM tx_project_domain_model_exhibition e
LEFT JOIN tx_project_exhibitions_artists_mm
ON tx_project_exhibitions_artists_mm.uid_local = e.uid
LEFT JOIN tx_project_domain_model_artist a
ON tx_project_exhibitions_artists_mm.uid_foreign = a.uid
WHERE e.sys_language_uid = $sys_language_uid
GROUP BY tx_project_exhibitions_artists_mm.uid_local
" );
return $query->execute();
}
但是通过这种方法,我无法将关系数据获取到我的控制器中分配的视图变量。只有展览相关的东西。
类\控制器\展览控制器.php
public function indexAction()
{
$queryResult = $this->exhibitionRepository->findExhibitions();
$this->view->assign('exhibitions', $queryResult);
}
有关如何解决此问题并仅从 ObjectStorage 中获取所需数据而不是所有内容的任何见解和建议?
提前致谢并致以最诚挚的问候