TYPO3 Extbase排序国外模型(1:n)
TYPO3 Extbase sort foreign Model (1:n)
我有一个 Seminar
和一个 Event
模型。研讨会与活动有 1:n
关系。
现在,当我 select 所有 $this->seminarRepository->findAll()
的研讨会时,我希望研讨会按 start_date
.
排序
我尝试更改 TCA foreign_sortby
和 foreign_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;
我有一个 Seminar
和一个 Event
模型。研讨会与活动有 1:n
关系。
现在,当我 select 所有 $this->seminarRepository->findAll()
的研讨会时,我希望研讨会按 start_date
.
我尝试更改 TCA foreign_sortby
和 foreign_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;