TYPO3 7.6后端模块列出来自多个表

时间:2018-05-01 15:10:54

标签: typo3 typo3-7.6.x typo3-extensions

我一直在苦苦挣扎一段时间,我以前找不到任何人做过同样的事情。

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

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

Productsorder(链接到客户)

ProductsorderPosition(订购产品,订购数量和尺寸以及产品订单的链接)

客户属于不同扩展名的型号。这些客户与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

如果我从产品库中使用此查询,它会返回适量的数据记录,但它们是产品类型,产品都是“空的”(uid = 0等)。

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

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

我已经考虑过将查询移到ProductsorderPositionRepository但是我可能会遇到类似的问题,它只会返回ProductsorderPosition中的信息,而其他一切都会被遗漏。

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

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

1 个答案:

答案 0 :(得分:1)

首先,您正在使用从多个表混合的数据子集进行连接查询。没有什么可以反对的。

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

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

您尚未提供正在执行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);

这应该以纯数组形式返回数据。

这是最简单的一个,但由于我们处于extbase环境中,因此不应该受到足够的痛苦。

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

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

  1. 使用查询结果列的属性和getter / setter创建模型
  2. 创建相应的存储库
  3. 第三种解决方案

    不好,但如果没有其他工作,请回到旧的TYPO3 v4查询方法:

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

    并将其替换为/ TYPO3 v8中的QueryBuilder。

    这真的不太好。

    我希望即使没有提供完整的解决方案,我也能以正确的方式指导你。