0

我正在尝试使用 Typo3 中的 QueryInterface 添加订单,但我不知道如何将我的 mysql 查询转换为 Typo3 查询。

这是我的mysql查询:

SELECT * FROM `primary_table` pt
ORDER BY (
 IFNULL(
  (select SUM(a.score) from child_table_1 a 
   left join child_table_1_mm b on a.uid = b.uid_foreign 
   where b.uid_local = pt.uid and a.uid = 3), 0) +
 IFNULL(
  (select SUM(a.score) from child_table_2 a 
   left join child_table_2_mm b on a.uid = b.uid_foreign 
   where b.uid_local = pt.uid and a.uid = 2), 0) +
 IFNULL(
  (select SUM(a.score) from child_table_3 a 
   where a.uid = pt.child_table_3_uid and a.uid = 0), 0)) 
desc;

所以基本上,我有一个主表,想要排序该表的结果,但要根据每个相关表的分数相加。在我的例子中,child_table_1 和 child_table_2 与主表的关系是 1:n,而 child_table_3 是 1:1。

我已经通过使用 QueryInterface 获得了订单.. 类似

$query->setOrderings(array('pt.firstname'=>QueryInterface:ORDER_ASCENDING));

我试图直接复制粘贴我的mysql-order-by-version,甚至尝试只使用一个孩子来让事情变得更容易,即使没有IFNULL,但我总是有错误“The ColumnMap for property “SUM(a” of class “...“ 不见了。

我尝试在 php 中而不是直接在 mysql 中对其进行排序,但是结果有限,因此我的排序无法正常工作,因为我没有所有结果。

我可以写类似的东西

$query->setOrderings(array('pt.child_table_1.score'=>QueryInterface:ORDER_DESCENDING));

但我不能在其中添加一个,也不是为每个孩子添加分数SUM的条件或可能性。uid = 3

出库时必须对结果进行排序。我不知道是否可以使用 TCA 配置文件完成某些事情。我在映射字段时看到了诸如 foreign_table 之类的属性,但我不知道如何在我的情况下使其工作。

如何通过 Typo3 的逻辑使用这个 mysql 顺序?

4

2 回答 2

0

我会在父元素的模型中添加一个特殊属性。不必将其添加到 TCA 定义中。

如果一般需要此附加属性,您可以在模型中进行必要的计算,或者在需要此属性的特定控制器操作中进行。

于 2020-12-03T11:05:35.213 回答
0

通常在连接到相关表的 TYPO3 字段中,应该将相关子项的数量作为一个值保存。每次添加或删除子项时,该字段的值都会更改。如果为 0,则还没有连接子记录。

因此,与其通过查询他们的表来计算相关子项的数量,不如按从主表中获取的那些字段的值进行排序。

于 2020-11-27T21:15:22.547 回答