Typo3 Typoscript - 在条件下选择使用OR运算符

时间:2018-03-08 12:09:46

标签: select typo3 typoscript or-operator

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

在我的示例中,文件的主要类别具有ID 1,并且其上有一些子类别。

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

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

这可以正常工作。

现在,我尝试在typoscript中做类似的事情,这看起来像:

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代码。我不知道这个错误的东西是不是有问题,或者我只是完全错了。

2 个答案:

答案 0 :(得分:1)

我认为您的查询错误(即使是纯SQL) 类别永远不会(?)立即引用,但始终使用sys_category_record_mm中的mm记录 因此,您的加入需要是另一个加入sys_categorysys_file通过这些mm记录(以及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记录给出)。它不是一个类别的uid 如果您经常使用uid = 1的类别,可能会产生误导。

以下是实现此查询的typoscript:

编辑:包含TypoScript(由FuFu提供) 这个typoscript-select对我有用,但我不得不将类别从根目录移到第一页。

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>

}

作为

答案 1 :(得分:0)

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