TYPO3 DBAL Querybuilder:嵌套的SELECT语句?

TYPO3 DBAL Querybuilder:嵌套的SELECT语句?,typo3,greatest-n-per-group,query-builder,Typo3,Greatest N Per Group,Query Builder,是否可以使用DBALQueryBuilder构建下面这样的嵌套SELECT语句 SELECT i.id, i.stable_id, i.version, i.title FROM initiatives AS i INNER JOIN ( SELECT stable_id, MAX(version) AS max_version FROM initiatives GROUP BY stable_id ) AS tbl1 ON i.stable_id = tbl1.stable_id AN

是否可以使用DBALQueryBuilder构建下面这样的嵌套SELECT语句

SELECT i.id, i.stable_id, i.version, i.title
FROM initiatives AS i
INNER JOIN (
    SELECT stable_id, MAX(version) AS max_version FROM initiatives GROUP BY stable_id
) AS tbl1
ON i.stable_id = tbl1.stable_id AND i.version = tbl1.max_version
ORDER BY i.stable_id ASC
目标是查询包含每个数据集的不同版本的外部非TYPO3表。应仅呈现具有最高版本号的数据集。数据库如下所示:

id,stable_id,version,[数据行的其余部分]

stable_id
是数据集的外部id
id
是内部自动递增id。
version
也会自动递增

代码示例:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($this->table);
$result = $queryBuilder
    ->select(...$this->select)
    ->from($this->table)
    ->join(
        'initiatives',
        $queryBuilder
            ->select('stable_id, MAX(version) AS max_version' )
            ->from('initiatives')
            ->groupBy('stable_id'),
        'tbl1',
        $queryBuilder->and(
            $queryBuilder->expr()->eq(
                'initiatives.stable_id',
                $queryBuilder->quoteIdentifier('tbl1.stable_id')
            ),
            $queryBuilder->expr()->eq(
                'initiatives.version',
                $queryBuilder->quoteIdentifier('tbl1.max_version')
            )
        )
    )
    ->orderBy('stable_id', 'DESC')

我想不出正确的语法用于。。。和声明。有什么想法吗?

Extbase查询具有
JOIN
功能,但在其他方面非常有限。不过,您可以使用自定义SQL(请参见
->statement()

构建复杂查询的更好的API是,包括对
连接的支持,数据库函数如
MAX()
和原始表达式(
->addSelectLiteral()
)。一定要读到最有趣的地方

因此,Extbase查询对于检索Extbase(model)对象非常有用。它可以隐式地利用它对数据结构的了解来节省一些代码,但只支持非常简单的查询

(DBAL)QueryBuilder满足所有其他需求。如果需要,还可以将原始数据转换为Extbase模型。(
$propertyMapper->convert($data,Job::class)

我意识到我们对两者缺乏明确的区分,因为它们在某个时候都被称为“QueryBuilder”,但它们完全不同。这就是为什么我喜欢在提到非Extbase时加上“学说”

一个在
多个条件上具有连接的示例

$q = TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(TYPO3\CMS\Core\Database\ConnectionPool::class)
    ->getQueryBuilderForTable('fe_users');

$res = $q->select('*')
    ->from('tt_content', 'c')
    ->join(
        'c',
        'be_users',
        'bu',
        $q->expr()->andX(
            $q->expr()->eq(
                'c.cruser_id', $q->quoteIdentifier('bu.uid')
            ),
            $q->expr()->comparison(
                '2', '=', '2'
            )
        )
    )
    ->setMaxResults(5)
    ->execute()
    ->fetchAllAssociative();

简短回答:这是不可能的,因为要加入的表是动态生成的。相关表达式被反勾选,因此会导致SQL错误

但是:SQL查询可以更改为以下基本相同的SQL查询:

SELECT i1.id,stable_id, version, title, p.name, l.name, s.name
FROM initiatives i1
WHERE version = (
    SELECT MAX(i2.version)
    FROM initiatives i2
    WHERE i1.stable_id = i2.stable_id
)
ORDER BY stable_id ASC
这可以使用DBAL queryBuilder重建:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($this->table);
$result = $queryBuilder
    ->select(...$this->select)
    ->from($this->table)
    ->where(
        $queryBuilder->expr()->eq(
            'initiatives.version',
            '(SELECT MAX(i2.version) FROM initiatives i2 WHERE initiatives.stable_id = i2.stable_id)'
        ),
    ->orderBy('stable_id', 'DESC')
    ->setMaxResults( 50 )
    ->execute();

对不起,是我的错。实际上,我想使用DBAL查询生成器。我也尝试过属性映射,但由于外部表的数据结构不符合类型3,因此未能成功。我添加了一个使用DBAL expression builder的非工作代码示例。运行代码时会出现什么错误?
调用undefined方法
。我尝试了不同的语法:$queryBuilder->and(),$queryBuilder->logicalAnd(),$queryBuilder->expr()->and(),$queryBuilder->expr()->logicalAnd(),但没有成功。查看源代码似乎表明,
JOIN….是不可能的。。。。通过DBAL querybuilder打开(…和…
语句。是这样吗?是的,这是可能的join('c','be_users','bu',$q->expr()->andX('q->expr()->eq('c.cruser_id',$q->quoteIdentifier('bu.uid')),$q->expr()->比较('2','=','2'))`