Extbase n:m setOrderings() 排序不正确

问题描述

我有课程,并且有多种开课类型和开课日期。

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 (将#修改为@)