gpt4 book ai didi

php - TYPO3 8.7 使用 Flexform uid 的查询排序

转载 作者:可可西里 更新时间:2023-10-31 23:15:20 26 4
gpt4 key购买 nike

我遇到了许多 TYPO3 扩展的问题,这些扩展通过 Uid 排序查询结果,这些 Uid 来自后端的 flexform 插件设置。我尝试创建一个查询,它以与来自插件设置的 flexform 相同的顺序给我结果 uid。就像我选择 data.uid 5 7 和 3,我的查询结果按这个顺序给我。

例如:

站点信息:

  • PHP 7.0
  • TYPO3 8.7
  • mariadb:10.1
  • Debian 服务器

此函数从 Controller 调用。

$partners = $this->partnerRepository->findByUids($this->settings['showMainSponsor']);

$this->settings['showMainSponsor'] 中的值为 ="3, 4 ,1"。

这些是 TYPO3 插件设置中所选区域的 Uid。

存储库函数“findByUids”如下所示。

public function findByUids($uids){

if(!isset($uids) || empty($uids)){
return NULL;
}

$uidListString = $uids;
if(!is_array($uids)){
$uidListString = explode(',', $uids);
}

$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(FALSE);

//here i set the orderings
$orderings = $this->orderByField('uid', $uidListString);
$query->setOrderings($orderings);

$query->matching(
$query->logicalAnd(
$query->in('uid', $uidListString)
)
);



return $query->execute();
}

此处调用名为“orderByField”的函数来设置所有排序。

/**
* @param string $field
* @param array $values
*
* @return array
*/
protected function orderByField($field, $values) {
$orderings = array();
foreach ($values as $value) {
$orderings["$field={$value}"] = \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING;
}
return $orderings;
}

这些通过来自 Flexform 的给定 uid 列表对查询结果进行排序的方法适用于 TYPO3 6.27.6。现在我尝试将此扩展附加到 TYPO3 8.6 项目,但此方法不再有效。我试图调试它并在查询中查找。在那里我发现是什么打破了这个查询。不起作用的查询如下所示:

SELECT `tx_partner_domain_model_partner`.* FROM `tx_partner_domain_model_partner` `tx_partner_domain_model_partner` WHERE (`tx_partner_domain_model_partner`.`uid` IN (3, 4, 1)) AND (`tx_partner_domain_model_partner`.`sys_language_uid` IN (0, -1)) AND ((`tx_partner_domain_model_partner`.`deleted` = 0) AND (`tx_partner_domain_model_partner`.`t3ver_state` <= 0) AND (`tx_partner_domain_model_partner`.`pid` <> -1) AND (`tx_partner_domain_model_partner`.`hidden` = 0) AND (`tx_partner_domain_model_partner`.`starttime` <= 1506603780) AND ((`tx_partner_domain_model_partner`.`endtime` = 0) OR (`tx_partner_domain_model_partner`.`endtime` > 1506603780))) ORDER BY `tx_partner_domain_model_partner`.`uid=3` DESC, `tx_partner_domain_model_partner`.`uid=4` DESC, `tx_partner_domain_model_partner`.`uid=1` DESC

我在我的 DBMS 上试过了,但失败了。原因是最后 3 个陈述。

`tx_partner_domain_model_partner`.`uid=3` DESC, `tx_partner_domain_model_partner`.`uid=4` DESC, `tx_partner_domain_model_partner`.`uid=1` DESC

TYPO3 使用 `` like 转义了 uid

 `tx_partner_domain_model_partner`.`uid=4` DESC

如果我们在没有这些 `` around the uid=3 的情况下像这样调用 ..

`tx_partner_domain_model_partner`.uid=3 DESC, `tx_partner_domain_model_partner`.uid=4 DESC, `tx_brapartner_domain_model_partner`.uid=1 DESC

它工作正常。也许 TYPO3 在他的最新版本上这样做是出于安全原因,但我没有为这个基本案例找到任何其他好的解决方案。目前我有一个 foreach,我通过 findByUid 查询每个 uid,但这在我看来不像是“最佳实践”方式。对于这种从数据库获取数据的情况,有人有更简洁的方法吗?或者这可能是一个错误?

我希望有人能帮助我。

最好的问候

法诺

最佳答案

没有覆盖:

清除默认排序:

$query->setOrderings(array());

将您的 QueryBuilder 转换为新的 Doctrine QB:

/** @var Typo3DbQueryParser $queryParser */
$queryParser = $this->objectManager->get(Typo3DbQueryParser::class);
/** @var QueryBuilder $doctrineQueryBuilder */
$doctrineQueryBuilder = $queryParser->convertQueryToDoctrineQueryBuilder($query);

通过 concreteQb 添加 UID

$concreteQb = $doctrineQueryBuilder->getConcreteQueryBuilder();
foreach ($uidList as $uid) {
$concreteQb->addOrderBy("$key={$uid}", QueryInterface::ORDER_DESCENDING);
}

获取映射结果:

/** @var DataMapper $dataMapper */
$dataMapper = $this->objectManager->get(DataMapper::class);
return $dataMapper->map(YourDataClass::class, $$doctrineQueryBuilder->execute()->fetchAll());

关于php - TYPO3 8.7 使用 Flexform uid 的查询排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46471525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com