在Extbase存储库中组合两个QueryResults

时间:2013-04-01 21:48:20

标签: php typo3 extbase typo3-flow

我正在编写TYPO3 - 网站的扩展程序。由于我使用的是Extbase Framework,我有一个Repository类(Tx_Extbase_Persistence_Repository),我在其中连续执行两个SQL查询:

$query1 = $this->createQuery();
$query1->statement($sql1);
$res1 = $query1->execute();

$query2 = $this->createQuery();
$query2->statement($sql2);
$res1 = $query2->execute();

$res 1和$res2都包含Tx_Extbase_Persistence_QueryResult。现在我想返回合并后的结果,我不知道如何完成。返回原始数组不是一个选项,因为我依赖QueryResult类的函数,我也想避免组合sql(UNION,JOIN)。我已经尝试过了:

$myResult = $this->objectManager->create('Tx_Extbase_Persistence_ObjectStorage')
foreach($res1 as $obj) {
    $myResult->attach($obj);
}
//foreach $res2

..但这会引发错误("could not determine the child object type"

那么如何正确组合两个Tx_Extbase_Persistence_QueryResult

修改

通过组合,我的意思是代替两个单独的QueryResults,我想要的只包含$query1$query2的结果。不幸的是,SQL-UNION或JOIN不是一个选项。

3 个答案:

答案 0 :(得分:7)

QueryResult实现了QueryResultInterface,它扩展了其他ArrayAccess。 有了这个,你可以使用offsetSet方法。

foreach ($res2->toArray() as $result) {
  $res1->offsetSet(($res1->count()), $result);
}

QueryResult $ res1现在也包含来自$ res2的对象。

答案 1 :(得分:2)

如果您不需要QueryResult-Object,可以使用array_merge来完成此操作。

$res1 = $this->createQuery()->execute();
$res2 = $this->createQuery()->execute();
$res = array_merge($res1->toArray(), $res2->toArray());

答案 2 :(得分:0)

通过编写组合结果很难猜出你是什么意思,但是,我只是在猜测,你应该使用自定义$query->statement($sql)来获取单result使用SQL的连接等。