TYPO3 Extbase排序国外模型(1:n)

TYPO3 Extbase sort foreign Model (1:n)

我有一个 Seminar 和一个 Event 模型。研讨会与活动有 1:n 关系。 现在,当我 select 所有 $this->seminarRepository->findAll() 的研讨会时,我希望研讨会按 start_date.

排序

我尝试更改 TCA foreign_sortbyforeign_default_sortby,我还尝试将排序直接添加到给定的存储库 $query->setOrderings(['events.start_date' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING]);。 None 确实有效。

研讨会模型

<?php
    namespace Vendor\Myext\Domain\Model;

    use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;

    class Seminar extends AbstractEntity
    {
        /**
         * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Myext\Domain\Model\Event>
         */
        protected $events;

研讨会 TCA

'events'           => [
    'exclude' => 1,
    'label'   => 'Veranstaltungen',
    'config'  => [
            'type'                => 'inline',
            'foreign_table'       => 'tx_myext_domain_model_event',
            'foreign_field'       => 'seminar',
            'foreign_default_sortby'      => 'ORDER BY tx_myext_domain_model_event.start_date ASC',
    ],
],

根据您的描述,这听起来像是不可能的,即使在纯 SQL 中也是如此,因为您无法按多个相关行的字段值对单行进行排序。

也许您想将相关事件的最接近开始日期反映到您的研讨会模型中,那么您可以简单地使用它在您的 SeminarRepository:

中进行排序
protected $defaultOrderings = [
    'nextEventStartDate' => QueryInterface::ORDER_DESCENDING,
];

好吧,似乎 foreign_default_sortby 还没有为 extbase 实现:https://review.typo3.org/c/Packages/TYPO3.CMS/+/61487

由于我的第一个解决方案无法正常工作(详情请参阅评论),我现在通过 PHP usort:

对事件数组进行排序
usort($events, function ($a, $b) {
    if ($a->getStartDate() == $b->getStartDate()) {
        return 0;
    }
    return ($a->getStartDate() > $b->getStartDate()) ? +1 : -1;
});

旧的无效答案

我的临时解决方案是使用foreign_sortby,但仅用于前端,因为foreign_default_sortby在后端工作正常。

研讨会 TCA

$seminarTca = [

    // More TCA stuff; missing some array keys in this code

    'events'           => [
            'exclude' => 1,
            'label'   => 'Veranstaltungen',
            'config'  => [
                    'type'                   => 'inline',
                    'foreign_table'          => 'tx_myext_domain_model_event',
                    'foreign_field'          => 'seminar',
                    'foreign_default_sortby' => 'start_date',
                    'maxitems'               => 999,
                    'appearance'             => [
                            'collapseAll'           => true,
                            'expandSingle'          => true,
                            'newRecordLinkAddTitle' => true,
                            'levelLinksPosition'    => 'both',
                            'useSortable '          => false,
                    ],
            ],
    ],
];

if (TYPO3_MODE === 'FE') {
    $seminarTca['columns']['events']['config']['foreign_sortby'] = 'start_date';
}

return $seminarTca;