首页 > 解决方案 > 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 中获取所需数据而不是所有内容的任何见解和建议?

提前致谢并致以最诚挚的问候

标签: phptypo3typo3-10.x

解决方案


推荐阅读