TYPO3 7.6 后端模块列出多个表中的值

TYPO3 7.6 Backend module to list values from several tables

我已经苦苦挣扎了一段时间,我真的找不到以前做过同样事情的人。

我正在 TYPO3 7.6 中创建属于商店扩展的后端模块。 带有后端模块的商店扩展是使用扩展构建器创建的。本店有以下三种型号:

产品(可通过商店订购的产品)

产品订单(link给客户)

ProductsorderPosition(订购的产品,订购的数量和尺寸以及link到Productsorder)

客户属于来自不同分机的模型类型。这些客户 linked 到 fe_users。

现在我想在我的后端模块中做的是获取与客户一起列出的所有这些订单的概览,一些关于 fe_user 的信息,当然还有产品。我创建了一个 sql-query,它确实是这样做的:

SELECT p.productname, p.productpriceperpiece,
    pop.amount, pop.size,
    h.name, h.address, h.zipcode, h.city, h.email, h.phone,
    f.first_name, f.last_name, f.email

    FROM `tx_gipdshop_domain_model_productorderposition` AS pop

    JOIN `tx_gipdshop_domain_model_product` AS p ON pop.products = p.uid
    JOIN `tx_gipdshop_domain_model_productsorder` AS po ON pop.productorder = po.uid
    JOIN `tx_gipleasedisturbhotels_domain_model_hotel` AS h ON po.hotel = h.uid
    JOIN `fe_users` AS f ON h.feuser = f.uid

如果我从产品存储库中使用此查询,它会返回正确数量的数据记录,但它们属于产品类型并且产品都是 "empty"(uid = 0 等)。

我在产品控制器 (getOrdersAction) 中为此添加了一个附加操作,在包含查询的存储库中我添加了一个方法 findAllOrders。

我仍然是 TYPO3 的初学者,但我能以某种方式理解为什么当从 ProductRepository 调用查询时 returns 数据集类型为 Product。但是我不知道如何从上面的查询中获取所有信息并将其列在后端模块中。

我已经考虑过将查询移动到 ProductsorderPositionRepository,但我可能会遇到类似的问题,它只会 return 来自 ProductsorderPosition 的信息,其他所有内容都会被排除在外。

有人能给我指出正确的方向吗? 我是否需要使用单独的存储库和控制器创建另一个模型?有没有更简单的方法?

如果您需要更多信息,请直接询问! ;)

首先,您正在对来自多个表的混合数据子集进行联合查询。这没什么可反对的。

因此,没有 "model" 具有混合数据集。 如果您在存储库中使用默认查询,则存储库背后的魔法假设查询语句的结果反映了为该存储库定义的基本模型。

将查询功能移动到另一个存储库并不能解决问题。

您没有提供执行 sql 语句的代码片段,所以我假设您已经使用存储库中的查询来执行该语句。像这样:

$result = $query->statement('
SELECT p.productname, p.productpriceperpiece,
pop.amount, pop.size,
h.name, h.address, h.zipcode, h.city, h.email, h.phone,
f.first_name, f.last_name, f.email

FROM `tx_gipdshop_domain_model_productorderposition` AS pop

JOIN `tx_gipdshop_domain_model_product` AS p ON pop.products = p.uid
JOIN `tx_gipdshop_domain_model_productsorder` AS po ON pop.productorder = po.uid
JOIN `tx_gipleasedisturbhotels_domain_model_hotel` AS h ON po.hotel = h.uid
JOIN `fe_users` AS f ON h.feuser = f.uid', NULL);

或使用过查询构建工具。

第一个解决方案

第一个也是最简单的解决方案是将结果检索为纯 php 数组。在 TYPO3 7.0 之前,您可以使用以下方法完成此操作:

$query->getQuerySettings()->setReturnRawQueryResult(TRUE);

在 TYPO3 7.0 中,这个弃用的方法已从核心中删除。 目前唯一的方法是定义查询并调用 $query->execute(TRUE);

这应该return纯数组形式的数据。

这是最简单的一个,但由于我们在 extbase 上下文中,这应该还不够痛苦。

第二个解决方案 - 不,只是我下一步要尝试的想法

第二个解决方案意味着你有一些工作要做,目前只是一个建议,因为我自己没有尝试过。

  1. 为查询的结果列创建具有属性和 getter/setters 的模型
  2. 创建对应的仓库

第三种解法

不太好,但如果没有别的办法,回退到旧的 TYPO3 v4 查询方法:

$GLOBALS['TYPO3_DB']->exec_SELECTgetRows([...]))

并将其替换为 QueryBuilder in/for TYPO3 v8.

这真不好看

我希望我能指导你正确的方法,即使没有给出完整的解决方案。