Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
extbase typo3中的聚合函数_Typo3_Extbase - Fatal编程技术网

extbase typo3中的聚合函数

extbase typo3中的聚合函数,typo3,extbase,Typo3,Extbase,我正在使用(如,in,contains) 但是如何在extbase查询语句中使用。我认为extbase查询的唯一解决方案是 $query->statement('SELECT AVG(clicks) FROM tablename ...') 还是不支持?据我所知,Extbase不支持在ORM中使用聚合函数。请参阅此处的更多信息: 您必须自己构建SQL查询(在语句中),并告诉查询返回原始结果(存储在数组中),而不是返回基于对象的查询 例如: $query = $this->creat

我正在使用(如,in,contains)


但是如何在extbase查询语句中使用。我认为extbase查询的唯一解决方案是

$query->statement('SELECT AVG(clicks) FROM tablename ...')

还是不支持?

据我所知,Extbase不支持在ORM中使用聚合函数。请参阅此处的更多信息:

您必须自己构建SQL查询(在语句中),并告诉查询返回原始结果(存储在数组中),而不是返回基于对象的查询

例如:

$query = $this->createQuery();
$query->statement("SELECT AVG(clicks) as 'avg' FROM tablename ...");
$query->getQuerySettings()->setReturnRawQueryResult(TRUE);
$result = $query->execute()[0][avg];
干杯,
Olivier

您唯一可以使用的函数是
COUNT()
with

return $query->execute()->count();

对于所有其他函数,您必须执行本机查询,如其他答案中所述。如果您使用纯SQL语句,则SQL注入可能会出现问题

更好的方法应该是使用新的doctrine querybuilder,它从8.7版开始提供:

// SELECT COUNT(`uid`) FROM `tt_content` WHERE (`bodytext` = 'klaus')
//     AND ((`tt_content`.`deleted` = 0) AND (`tt_content`.`hidden` = 0)
//     AND (`tt_content`.`starttime` <= 1475580240)
//     AND ((`tt_content`.`endtime` = 0) OR (`tt_content`.`endtime` > 1475580240)))
$count = $queryBuilder
   ->count('uid')
   ->from('tt_content')
   ->where(
      $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus'))
    )
   ->execute()
   ->fetchColumn(0);
//从'tt_content'中选择COUNT('uid'),其中('bodytext`='klaus'))
//和(`tt_content`.`deleted`=0)和(`tt_content`.`hidden`=0)
//和(`tt_content`.`starttime`1475580240)))
$count=$queryBuilder
->计数('uid')
->from('tt_content')
->在哪里(
$queryBuilder->expr()->eq('bodytext',$queryBuilder->createNamedParameter('klaus'))
)
->执行()
->获取列(0);

正如其他人所指出的,您不能在查询对象本身上使用这些函数。但是,您可以使用以下内容:

使用TYPO3\CMS\Core\Utility\general功能;
使用TYPO3\CMS\Core\Database\ConnectionPool;
$queryBuilder=GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(“我的表格”);
$statement=$queryBuilder
->选择('uid')
->addSelectLiteral(
$queryBuilder->expr()->max('interest\u field'、'awesome\u alias')
)
->来自(‘我的桌子’)
->groupBy(“有趣的字段”)
->执行();

请注意,这将返回一个QueryResult对象。

Nop,我正在寻找像AVG()、MAX()和其他聚合函数这样的方法,就像我们已经为like()、IN()等找到的那样。这些方法在Extbase中不存在:。
// SELECT COUNT(`uid`) FROM `tt_content` WHERE (`bodytext` = 'klaus')
//     AND ((`tt_content`.`deleted` = 0) AND (`tt_content`.`hidden` = 0)
//     AND (`tt_content`.`starttime` <= 1475580240)
//     AND ((`tt_content`.`endtime` = 0) OR (`tt_content`.`endtime` > 1475580240)))
$count = $queryBuilder
   ->count('uid')
   ->from('tt_content')
   ->where(
      $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus'))
    )
   ->execute()
   ->fetchColumn(0);