问题描述
我有课程,并且有多种开课类型和开课日期。
starttype = 1 // date
starttype = 2 // on_request
starttype = 3 // continuously
所以我先按 starttype 然后按 startdatetime 对课程进行排序。现在它产生的顺序只使用开始中的第一个条目而不是最早的条目。但是,如果我在数据库上使用查询,则排序符合预期。看起来查询和数据库之间有一些“魔法”。我的问题有解决方案吗?
在我的控制器中,我设置了在许多示例中发现的排序
/**
* Find all courses and sort them by start type and start date
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
*/
public function findAllSorted() {
$query = $this->createquery();
$query->setorderings([
'starts.starttype' => QueryInterface::ORDER_ASCENDING,'starts.startdatetime' => QueryInterface::ORDER_ASCENDING
]);
$query->matching(
$query->logicalOr([
$query->greaterThan('starts.starttype',1),$query->greaterThan('starts.startdatetime',time())
]));
// Debug query
//$queryParser = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser::class);
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->convertQueryTodoctrineQueryBuilder($query)->getsql());
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->convertQueryTodoctrineQueryBuilder($query)->getParameters());
return $query->execute();
}
这导致以下查询
SELECT `tx_vendorcontinuingeducation_domain_model_course`.*
FROM `tx_vendorcontinuingeducation_domain_model_course` `tx_vendorcontinuingeducation_domain_model_course`
LEFT JOIN `tx_vendorcontinuingeducation_domain_model_start` `tx_vendorcontinuingeducation_domain_model_start` ON `tx_vendorcontinuingeducation_domain_model_course`.`uid` = `tx_vendorcontinuingeducation_domain_model_start`.`parent`
WHERE ((`tx_vendorcontinuingeducation_domain_model_start`.`starttype` > :dcValue1)
OR (`tx_vendorcontinuingeducation_domain_model_start`.`startdatetime` > :dcValue2))
AND (`tx_vendorcontinuingeducation_domain_model_course`.`sys_language_uid` IN (0,-1))
AND (`tx_vendorcontinuingeducation_domain_model_course`.`t3ver_oid` = 0)
AND ((`tx_vendorcontinuingeducation_domain_model_course`.`deleted` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`t3ver_state` <= 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`t3ver_wsid` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`t3ver_oid` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`hidden` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`starttime` <= 1619622660)
AND ((`tx_vendorcontinuingeducation_domain_model_course`.`endtime` = 0)
OR (`tx_vendorcontinuingeducation_domain_model_course`.`endtime` > 1619622660))
AND (((`tx_vendorcontinuingeducation_domain_model_course`.`fe_group` = '')
OR (`tx_vendorcontinuingeducation_domain_model_course`.`fe_group` IS NULL)
OR (`tx_vendorcontinuingeducation_domain_model_course`.`fe_group` = '0')
OR (FIND_IN_SET('0',`tx_vendorcontinuingeducation_domain_model_course`.`fe_group`))
OR (FIND_IN_SET('-1',`tx_vendorcontinuingeducation_domain_model_course`.`fe_group`)))))
AND (((`tx_vendorcontinuingeducation_domain_model_start`.`deleted` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`t3ver_state` <= 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`t3ver_wsid` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`t3ver_oid` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`hidden` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`starttime` <= 1619622660)
AND ((`tx_vendorcontinuingeducation_domain_model_start`.`endtime` = 0)
OR (`tx_vendorcontinuingeducation_domain_model_start`.`endtime` > 1619622660))
AND (((`tx_vendorcontinuingeducation_domain_model_start`.`fe_group` = '')
OR (`tx_vendorcontinuingeducation_domain_model_start`.`fe_group` IS NULL)
OR (`tx_vendorcontinuingeducation_domain_model_start`.`fe_group` = '0')
OR (FIND_IN_SET('0',`tx_vendorcontinuingeducation_domain_model_start`.`fe_group`))
OR (FIND_IN_SET('-1',`tx_vendorcontinuingeducation_domain_model_start`.`fe_group`)))))
OR (`tx_vendorcontinuingeducation_domain_model_start`.`uid` IS NULL))
ORDER BY `tx_vendorcontinuingeducation_domain_model_start`.`starttype` ASC,`tx_vendorcontinuingeducation_domain_model_start`.`startdatetime` ASC
和价值观
array(2 items)
dcValue1 => 1 (integer)
dcValue2 => 1619622708 (integer)
现在我替换 dcValues 并将它们复制到我的 PHPMyAdmin
SELECT `tx_vendorcontinuingeducation_domain_model_course`.*
FROM `tx_vendorcontinuingeducation_domain_model_course` `tx_vendorcontinuingeducation_domain_model_course`
LEFT JOIN `tx_vendorcontinuingeducation_domain_model_start` `tx_vendorcontinuingeducation_domain_model_start` ON `tx_vendorcontinuingeducation_domain_model_course`.`uid` = `tx_vendorcontinuingeducation_domain_model_start`.`parent`
WHERE ((`tx_vendorcontinuingeducation_domain_model_start`.`starttype` > 1)
OR (`tx_vendorcontinuingeducation_domain_model_start`.`startdatetime` > 1619619086))
AND (`tx_vendorcontinuingeducation_domain_model_course`.`sys_language_uid` IN (0,-1))
AND (`tx_vendorcontinuingeducation_domain_model_course`.`t3ver_oid` = 0)
AND ((`tx_vendorcontinuingeducation_domain_model_course`.`deleted` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`t3ver_state` <= 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`t3ver_wsid` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`t3ver_oid` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`hidden` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_course`.`starttime` <= 1619619060)
AND ((`tx_vendorcontinuingeducation_domain_model_course`.`endtime` = 0)
OR (`tx_vendorcontinuingeducation_domain_model_course`.`endtime` > 1619619060))
AND (((`tx_vendorcontinuingeducation_domain_model_course`.`fe_group` = '')
OR (`tx_vendorcontinuingeducation_domain_model_course`.`fe_group` IS NULL)
OR (`tx_vendorcontinuingeducation_domain_model_course`.`fe_group` = '0')
OR (FIND_IN_SET('0',`tx_vendorcontinuingeducation_domain_model_course`.`fe_group`)))))
AND (((`tx_vendorcontinuingeducation_domain_model_start`.`deleted` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`t3ver_state` <= 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`t3ver_wsid` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`t3ver_oid` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`hidden` = 0)
AND (`tx_vendorcontinuingeducation_domain_model_start`.`starttime` <= 1619619060)
AND ((`tx_vendorcontinuingeducation_domain_model_start`.`endtime` = 0)
OR (`tx_vendorcontinuingeducation_domain_model_start`.`endtime` > 1619619060))
AND (((`tx_vendorcontinuingeducation_domain_model_start`.`fe_group` = '')
OR (`tx_vendorcontinuingeducation_domain_model_start`.`fe_group` IS NULL)
OR (`tx_vendorcontinuingeducation_domain_model_start`.`fe_group` = '0')
OR (FIND_IN_SET('0',`tx_vendorcontinuingeducation_domain_model_start`.`startdatetime` ASC
PHPMyAdmin 中的排序是正确的。这是错误还是我该如何解决?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)