【发布时间】:2018-03-10 08:06:25
【问题描述】:
我遇到了许多 TYPO3 扩展的问题,它们按 Uid 排序查询结果,这些结果来自后端中的 flexform 插件设置。我尝试创建一个查询,它以相同的顺序为我提供结果 uid,就像 flexform 来自插件设置一样。就像我选择 data.uid 5 7 和 3 一样,我的查询结果按这个顺序给我。
例如:
网站信息:
- PHP 7.0
- TYPO3 8.7
- mariadb:10.1
- Debian 服务器
这个函数是从控制器调用的。
$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.2 和 7.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
如果我们在没有这些 `` 的情况下像这样调用 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,但这在我看来并不是一种“最佳实践”方式。对于这种从数据库获取数据的情况,有人有更清洁的方法吗?或者这可能是一个错误?
我希望有人可以帮助我。
最好的问候
粉丝
【问题讨论】:
标签: php doctrine typo3 extbase