如何使用AND查询创建与两个或多个关联类别的tx_news项匹配的select子句

时间:2019-02-08 14:41:17

标签: select typo3 categories typoscript tx-news

我尝试创建一个查询以获取所有带有至少两个不同类别标记的新闻项,并且它们必须与AND子句匹配。

无论是否应呈现以下代码,我都需要此查询来做出决定。例如。如果没有类别为A和类别B的新闻,则不执行任何操作。否则显示tx_news LIST视图。

lib.field_dmnewsplugin.5 = CONTENT 
lib.field_dmnewsplugin.5 {
    table = tx_news_domain_model_news
    select {
        pidInList = 124
        max = 9
        orderBy = uid DESC

        leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid)
        #andWhere = sys_category_record_mm.uid_local IN (14,16)
        #where = sys_category_record_mm.uid_local = 14
        andWhere = sys_category_record_mm.uid_local = 14 AND sys_category_record_mm.uid_local = 16
    }
    renderObj = COA
    renderObj {
        1 = TEXT
        1.value = Aktuelles
        1.wrap = <h2>|</h2>
        2 = TEXT
        2.field = title
        2.crop = 50|...|1
        2.wrap = <h3>|</h3>
        3 = TEXT
        3.field = teaser
        3.crop = 500|...|1
        3.wrap = <p>|</p>
        }
    }

我的代码是一些测试的结果。使用“ andWhere”子句,结果为空。如果没有任何where子句,我将为所有新闻项输入两次条目,因为它们都至少具有两个不同的类别。 我的目标是为每个新闻项获得唯一的结果,并标记为类别A和类别B(并且可能作为通用解决方案附加类别)。

我该怎么办?

先谢谢您

拉尔夫

2 个答案:

答案 0 :(得分:0)

尝试将WHERE子句放入JOIN的ON部分,并使用groupBy获取计数器。

select {
    selectFields = count(*) AS counter
    leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid) AND sys_category_record_mm.uid_local IN (14,16)
    pidInList = 124
    max = 9
    groupBy = uid
    orderBy = uid DESC
    where = counter > 1
}

答案 1 :(得分:0)

在我不得不意识到乔的解决方案对我不起作用之后,我有了另一个主意:

lib.field_dmnewsplugin = COA
    lib.field_dmnewsplugin {
        10 = CONTENT 
        10 {
            table = tx_news_domain_model_news
            select {
                selectFields = title, teaser, count(uid) AS counter
                leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid) AND sys_category_record_mm.uid_local IN ({14,###maincat###)
                pidInList = 124
                max = 1
                groupBy = uid
                orderBy = counter DESC, crdate DESC
                #where = counter > 1
                markers {
                    maincat.value = 16
                    }
                }
            renderObj = COA
            renderObj {
                10 = COA
                10 {
                    stdWrap {
                        if {
                            value = 1
                            isGreaterThan.data = field:counter
                            #equals.data = field:counter
                            }
                        required = 1
                        wrap = <h2>Some Headline</h2>
                        }
                    10 = USER
                    10 {
                        userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
                        extensionName = News
                        pluginName = Pi1
                        vendorName = GeorgRinger

                        switchableControllerActions {
                            News {
                                1 = list
                                }
                            }
                        settings < plugin.tx_news.settings
                        settings {
                            cropMaxCharacters = 164 | &nbsp;[...] | 1
                            categoryConjunction = and
                            categories = 14,16
                            excludeAlreadyDisplayedNews = 1
                            archiveRestriction = active
[...]

问题是,我们不能在where子句中使用别名“ counter”,并且我不知道如何解决错字问题。使用本地SQL可能会有更好的方法。

但是我能够获得“ counter”的值来创建“ if”规则。另外,我可以按“计数器”对查询进行排序。因此,如果查询返回的至少一个“计数器”大于1的匹配,我可以决定渲染一个COA对象,例如带有标题的新闻列表视图。

我对这个解决方案感到满意。但是也许,有人对我有特殊的把戏?

感谢您的帮助,

拉尔夫