【问题标题】:Typo3 Typoscript-Select use OR-operator in where conditionTypo3 Typoscript-Select 在 where 条件下使用 OR 运算符
【发布时间】:2018-03-08 12:09:46
【问题描述】:

我尝试从表 sys_files 中选择所有与一个类别或子类别链接的文件。

在我的示例中,文件的主要类别的 ID 为 1,上面还有一些子类别。

我首先创建了 SQL-Code,直接在数据库上试用:

SELECT sys_file.name, sys_file.identifier, sys_category.title 
FROM sys_category 
RIGHT JOIN sys_file_metadata ON (sys_file_metadata.categories = 
sys_category.uid) 
JOIN sys_file ON (sys_file.uid = sys_file_metadata.file) 
WHERE (sys_category.parent = 1) OR (sys_category.uid = 1) 
order By sys_category.title

这可以正常工作。

现在,我尝试在打字稿中进行类似的操作,如下所示:

lib.documentindex = CONTENT
lib.documentindex {
  wrap = <ul>|</ul>

  table = sys_category
  select {
    selectFields = sys_file.name, sys_file.identifier, sys_category.title
    rightjoin = sys_file_metadata ON (sys_file_metadata.categories = sys_category.uid) join sys_file ON (sys_file.uid = sys_file_metadata.file)
    where = sys_category.uid = 1 OR sys_category.parent = 1
    orderBy = sys_category.title
  }

  renderObj = COA
  renderObj.wrap = <li>|</li>
  renderObj.10 = TEXT
  renderObj.10 {
    field = identifier
    wrap = <a href="|">
  }
  renderObj.20 = TEXT
  renderObj.20.field = name
  renderObj.30 = TEXT
  renderObj.30.value = </a>

}

这不起作用。但真正奇怪的是,它工作了一半。 所以如果我这样写:

where = sys_category.uid = 1 OR sys_category.parent = 1

它显示为所有具有父级为 1 的类别的文件。 但它不会显示 id 为 1 的类别的文件。

我现在这样写吗

where = sys_category.parent = 1 OR sys_category.uid = 1

反之亦然,它显示 id 为 1 的类别的文件。但没有父 id 为 1 的文件。

在select的官方文档中(找到here),它只是告诉了where-option:

没有单词“WHERE”的WHERE子句。

但这还不是全部。我尝试了很多东西,而且我尝试的所有东西都不像真正的 SQL 代码。我不知道这个typo3 的东西是不是有问题,或者我只是用错了。

【问题讨论】:

  • 您使用的是哪个 TYPO3 版本?
  • 嗨,我用的是 7.6.18。

标签: select typo3 typoscript or-operator


【解决方案1】:

我认为您的查询是错误的(即使是纯 SQL)。
类别从不(?)立即引用,但始终与 sys_category_record_mm 中的 mm 记录一起引用。
所以你的加入需要是另一个你加入sys_categorysys_file通过这些mm-records(和sys_file_metadata记录):

SELECT sys_file.name, sys_file.identifier, sys_category.title
FROM sys_category
JOIN sys_category_record_mm 
  ON sys_category_record_mm.uid_local = sys_category.uid
JOIN sys_file_metadata 
  ON sys_file_metadata.uid = sys_category_record_mm.uid_foreign
JOIN sys_file 
  ON sys_file_metadata.file = sys_file.uid
WHERE sys_category_record_mm.tablenames = "sys_file_metadata" 
  AND sys_category_record_mm.fieldname = "categories"
  AND ((sys_category.parent = 1) OR (sys_category.uid = 1)) 
ORDER By sys_category.title

注意:分类记录中有类别字段,但这些字段仅包含引用的计数器(由 mm-records 给出)。它不是类别的 uid。
如果您经常使用 uid = 1 的类别,可能会产生误导。

这是实现这个查询的打字稿:

编辑:包括 TypoScript(由 FuFu 提供) 这个打字选择对我有用,但我必须将类别从根目录移到第一页。

lib.documentindex = CONTENT
lib.documentindex {
  wrap = <ul>|</ul>

  table = sys_category
  select {
    pidInList = 1
    recursive = 1000
    selectFields = sys_file.name, sys_file.identifier, sys_category.title
    join = sys_category_record_mm ON (sys_category_record_mm.uid_local = sys_category.uid) JOIN sys_file_metadata ON (sys_file_metadata.uid = sys_category_record_mm.uid_foreign) JOIN sys_file ON (sys_file_metadata.file = sys_file.uid)
    where = (sys_category_record_mm.tablenames = "sys_file_metadata") AND (sys_category_record_mm.fieldname = "categories") AND ((sys_category.parent = 1) OR (sys_category.uid = 1))
    orderBy = sys_category.title
  }

  renderObj = COA
  renderObj.wrap = <li>|</li>
  renderObj.10 = TEXT
  renderObj.10 {
    field = identifier
    wrap = <a href="|">
  }
  renderObj.20 = TEXT
  renderObj.20.field = name
  renderObj.30 = TEXT
  renderObj.30.value = </a>

}

作为

【讨论】:

  • 谢谢,您的查询在 SQL 中运行良好。我有一些问题要在打字稿中从中获得有效的选择。但我想我只需要多尝试一下。当我发表你的帖子时,我会投票赞成,并分享我的打字稿选择。
【解决方案2】:

您是否尝试过使用 DataProcessing?您可以组合两个 DatabaseQueryProcessor 来获得所需的内容。见:https://docs.typo3.org/typo3cms/TyposcriptReference/7.6/ContentObjects/Fluidtemplate/Index.html#dataprocessing

【讨论】:

  • 谢谢。我没有尝试这个,因为 Bernd Wilke πφ 的帖子对我有用。
猜你喜欢
  • 2014-08-21
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2020-07-21
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
相关资源
最近更新 更多