Extbase 固有关系发现
Extbase proper relation discovery
我在处理一些 semi-complicated 逻辑来过滤我们正在使用的 LMS 工具的课程时遇到了一个奇怪的问题。
逻辑如下:
- 有课程模板和研讨会
- 课程模板总是有开始和结束日期,它包含相互依赖的课程
- 一个研讨会包含多个相互不依赖的课程
- 只要课程模板在所选日期之后开始,就必须显示
- 只要研讨会包含在所选日期之后开始的课程,就必须显示它
- 还有其他过滤器在这里无关紧要,不影响这个问题
为了解决这个请求,我借助了 extbase 的强大功能,它能够通过使用 $query->greaterThanOrEqual('template_children.start_date', $date)
之类的东西简单地创建一个子查询(具体示例见下文)。这现在生成以下结果:
结果SQL:
SELECT `tx_xxx_domain_model_courseprogrammetemplate`.*
FROM `tx_xxx_domain_model_courseprogrammetemplate`
`tx_xxx_domain_model_courseprogrammetemplate`
LEFT JOIN `tx_xxx_domain_model_courseprogrammetemplate`
`tx_xxx_domain_model_courseprogrammetemplate0`
ON Find_in_set(
`tx_xxx_domain_model_courseprogrammetemplate0`.`uid`,
`tx_xxx_domain_model_courseprogrammetemplate`.`template_children`)
关系是由重要人物建立的,并且没有值写入关系这一侧的字段template_children
,因此找不到结果。
AFAIK,除了 maybe 数量 children 之外,无需在该字段中填充任何其他内容,这应该可以工作(而且我不确定这是否均匀不再需要了)。
这是我的 TCA 配置和处理逻辑的 PHP 代码。
TCA:
'template_children' => [
'exclude' => true,
'label' => 'LLL:EXT:xxx/Resources/Private/Language/locallang_db.xlf:tx_xxx_domain_model_courseprogrammetemplate.template_children',
'config' => [
'items' => [
['', 0]
],
'type' => 'select',
'renderType' => 'selectSingleBox',
'foreign_table' => 'tx_xxx_domain_model_courseprogrammetemplate',
'foreign_table_where' => 'AND tx_xxx_domain_model_courseprogrammetemplate.template = ###REC_FIELD_uid### AND tx_xxx_domain_model_courseprogrammetemplate.sys_language_uid = 0',
'readOnly' => 1,
'size' => 5,
'maxitems' => 100,
'autoSizeMax' => 20,
],
],
分机库:
$constraints[] =
$query->logicalAnd(
[
$query->logicalOr(
[
// If the learning form is a course, the start and end date should be in between the period
$query->logicalAnd(
[
$query->greaterThanOrEqual('start_date', $demand->getStartDate()->format('Y-m-d H:i:s')),
$query->logicalNot($query->equals('learning_form', 'Seminar'))
]
),
// If the learning form is seminar, we only want to display it, if there is at least one course that starts in this period
$query->logicalAnd(
[
$query->logicalOr(
[
$query->greaterThanOrEqual('templateChildren.start_date', $demand->getStartDate()->format('Y-m-d H:i:s')),
]
),
$query->equals('learning_form', 'Seminar')
]
)
]
)
]
);
我尝试将 TCA 字段类型切换为 inline
,但这并没有改变行为。
另一种方法是获取所有 objects 与匹配过滤器的每个研讨会相关的内容,但这意味着在过滤器时创建数千个单独的查询 :-/
感谢您的支持。
PS:我找到这篇文章,但它没有描述如何相应地配置 TCA,以便它工作:
同样令人遗憾的是,文档并没有说明如何在 TCA 中配置什么以使其工作:
https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/6-Persistence/3-implement-individual-database-queries.html
我最终找到了问题的解决方案:您必须使用内联作为类型,以便 extbase 有机会知道如何解析关系:
'template_children' => [
'exclude' => true,
'label' => 'LLL:EXT:xxx/Resources/Private/Language/locallang_db.xlf:tx_xxx_domain_model_courseprogrammetemplate.template_children',
'config' => [
'items' => [
['', 0]
],
'type' => 'inline',
'foreign_table' => 'tx_xxx_domain_model_courseprogrammetemplate',
'foreign_field' => 'template',
'appearance' => [
'collapseAll' => 1,
'levelLinksPosition' => 'top',
'showSynchronizationLink' => 1,
'showPossibleLocalizationRecords' => 1,
'showAllLocalizationLink' => 1
],
'overrideChildTca' => [
'ctrl' => [
'types' => [
'1' => ['showitem' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title'],
],
],
],
],
],
我在处理一些 semi-complicated 逻辑来过滤我们正在使用的 LMS 工具的课程时遇到了一个奇怪的问题。
逻辑如下:
- 有课程模板和研讨会
- 课程模板总是有开始和结束日期,它包含相互依赖的课程
- 一个研讨会包含多个相互不依赖的课程
- 只要课程模板在所选日期之后开始,就必须显示
- 只要研讨会包含在所选日期之后开始的课程,就必须显示它
- 还有其他过滤器在这里无关紧要,不影响这个问题
为了解决这个请求,我借助了 extbase 的强大功能,它能够通过使用 $query->greaterThanOrEqual('template_children.start_date', $date)
之类的东西简单地创建一个子查询(具体示例见下文)。这现在生成以下结果:
结果SQL:
SELECT `tx_xxx_domain_model_courseprogrammetemplate`.*
FROM `tx_xxx_domain_model_courseprogrammetemplate`
`tx_xxx_domain_model_courseprogrammetemplate`
LEFT JOIN `tx_xxx_domain_model_courseprogrammetemplate`
`tx_xxx_domain_model_courseprogrammetemplate0`
ON Find_in_set(
`tx_xxx_domain_model_courseprogrammetemplate0`.`uid`,
`tx_xxx_domain_model_courseprogrammetemplate`.`template_children`)
关系是由重要人物建立的,并且没有值写入关系这一侧的字段template_children
,因此找不到结果。
AFAIK,除了 maybe 数量 children 之外,无需在该字段中填充任何其他内容,这应该可以工作(而且我不确定这是否均匀不再需要了)。
这是我的 TCA 配置和处理逻辑的 PHP 代码。
TCA:
'template_children' => [
'exclude' => true,
'label' => 'LLL:EXT:xxx/Resources/Private/Language/locallang_db.xlf:tx_xxx_domain_model_courseprogrammetemplate.template_children',
'config' => [
'items' => [
['', 0]
],
'type' => 'select',
'renderType' => 'selectSingleBox',
'foreign_table' => 'tx_xxx_domain_model_courseprogrammetemplate',
'foreign_table_where' => 'AND tx_xxx_domain_model_courseprogrammetemplate.template = ###REC_FIELD_uid### AND tx_xxx_domain_model_courseprogrammetemplate.sys_language_uid = 0',
'readOnly' => 1,
'size' => 5,
'maxitems' => 100,
'autoSizeMax' => 20,
],
],
分机库:
$constraints[] =
$query->logicalAnd(
[
$query->logicalOr(
[
// If the learning form is a course, the start and end date should be in between the period
$query->logicalAnd(
[
$query->greaterThanOrEqual('start_date', $demand->getStartDate()->format('Y-m-d H:i:s')),
$query->logicalNot($query->equals('learning_form', 'Seminar'))
]
),
// If the learning form is seminar, we only want to display it, if there is at least one course that starts in this period
$query->logicalAnd(
[
$query->logicalOr(
[
$query->greaterThanOrEqual('templateChildren.start_date', $demand->getStartDate()->format('Y-m-d H:i:s')),
]
),
$query->equals('learning_form', 'Seminar')
]
)
]
)
]
);
我尝试将 TCA 字段类型切换为 inline
,但这并没有改变行为。
另一种方法是获取所有 objects 与匹配过滤器的每个研讨会相关的内容,但这意味着在过滤器时创建数千个单独的查询 :-/
感谢您的支持。
PS:我找到这篇文章,但它没有描述如何相应地配置 TCA,以便它工作:
我最终找到了问题的解决方案:您必须使用内联作为类型,以便 extbase 有机会知道如何解析关系:
'template_children' => [
'exclude' => true,
'label' => 'LLL:EXT:xxx/Resources/Private/Language/locallang_db.xlf:tx_xxx_domain_model_courseprogrammetemplate.template_children',
'config' => [
'items' => [
['', 0]
],
'type' => 'inline',
'foreign_table' => 'tx_xxx_domain_model_courseprogrammetemplate',
'foreign_field' => 'template',
'appearance' => [
'collapseAll' => 1,
'levelLinksPosition' => 'top',
'showSynchronizationLink' => 1,
'showPossibleLocalizationRecords' => 1,
'showAllLocalizationLink' => 1
],
'overrideChildTca' => [
'ctrl' => [
'types' => [
'1' => ['showitem' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title'],
],
],
],
],
],