首页 > 解决方案 > Extbase 正确的关系发现

问题描述

我在处理一些半复杂的逻辑来过滤我们正在使用的 LMS 工具的课程时遇到了一个奇怪的 extbase 问题。

逻辑如下:

  1. 有课程模板和研讨会
  2. 课程模板总是有开始和结束日期,它包含相互依赖的课程
  3. 研讨会包含多个不相互依赖的课程
  4. 只要课程模板在所选日期之后开始,就必须显示
  5. 只要研讨会包含在所选日期之后开始的课程,就必须显示
  6. 还有其他过滤器在这里无关紧要,不会影响这个问题

为了解决这个请求,我求助于 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,这应该可以工作,而不必用其他任何东西填充这个字段,而不是可能有大量的孩子(我不确定这是否还有必要)。

这是我的 TCA 配置和处理逻辑的 PHP 代码。

三氯乙酸:

    '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但这并没有改变行为。

另一种方法是获取与每个研讨会相关且匹配过滤器的所有对象,但这意味着在过滤时创建数千个单独的查询:-/

谢谢你的支持。

PS:我找到了这篇文章,但它没有描述如何相应地配置 TCA,以便它工作: TYPO3 Extbase:过滤 1:N 关系 同样遗憾的是,文档并没有说明在 TCA 中如何配置的内容为此工作: https ://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/6-Persistence/3-implement-individual-database-queries.html

标签: typo3extbase

解决方案


我最终找到了解决问题的方法:您必须使用 inline 作为类型,以便 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'],
                        ],
                    ],
                ],
        ],
    ],

推荐阅读