Как создать предложение select с запросом AND, который сопоставляет элементы tx_news с двумя или более ассоциированными категориями - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь создать запрос, чтобы получить все новости, которые помечены как минимум двумя разными категориями и должны соответствовать предложению AND.

Мне нужен этот запрос, чтобы принять решение, еслиследующий код должен быть представлен или нет.Например, если нет новостей с категорией A и категорией B, ничего не делайте.Иначе show tx_news LIST view.

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 голосов
/ 15 февраля 2019

После того, как я понял, что решение Джо не работает для меня, у меня появилась другая идея:

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
[...]

Проблема в том, что мы не можем использовать псевдоним "counter" в предложении where иЯ понятия не имею, как я могу решить проблему с опечаткой.С нативным SQL может быть лучший способ.

Но я могу получить значение "counter", чтобы создать правило "if".И кроме того, я могу отсортировать запрос по «счетчику».Таким образом, если запрос возвращает хотя бы одно попадание с «счетчиком» больше 1, я могу решить отобразить объект COA как представление списка новостей с заголовком.

Я удовлетворен этим решением.Но, может быть, у кого-то есть специальный трюк для меня?

Спасибо за вашу помощь,

Ральф

0 голосов
/ 09 февраля 2019

Попробуйте вставить предложение WHERE в ON-часть JOIN и использовать 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
}
...