如何使用DBAL查询生成器来构建此子查询?

问题描述:

我有这个查询子查询。如何使用DBAL查询生成器来构建此子查询?

SELECT * FROM 
(SELECT module_id FROM an_modules AS m LIMIT 20 OFFSET 0) AS m 
LEFT JOIN an_module_sites AS ms ON (m.module_id = ms.module_id) 

如何使用DBAL构建像这样的子查询?
这似乎不是工作。

$qb->select('*') 
    ->from(
     $qb->select('module_id') 
      ->from($this->Db->getTableName('modules'), 'm') 
     , 'm') 
    ->leftJoin('m', $this->Db->getTableName('module_sites'), 'ms', 'm.module_id = ms.module_id'); 
$stmt = $qb->execute(); 
$result = $stmt->fetchAll(); 
+1

查询构建器不'支持来自查询的来自语句。我建议你直接通过连接'$ conn-> executeQuery(..'或者如果你需要与'statement'交互处理'$ stmt = $ conn-> prepare($ sql);'然后你可以绑定值等... – Matteo

我最近需要做到这一点来实现分页/排序助手。作为其中的一部分,我将采用由我的模型执行的查询构建器,并统一计算在无限制时将产生的总行数。

要跨平台我不能使用rowCount和潜在的分组意味着我不能只改变选择字段 - 所以最好的选择是删除限制并将其计为子查询。这是我想出了:

<?php 
$totalResults = $qb->getConnection()->createQueryBuilder() 
    ->select('COUNT(*)') 
    ->from(
     '(' 
     .$qb 
      ->setFirstResult(null) 
      ->setMaxResults(null) 
      ->resetQueryPart('orderBy') 
      ->getSQL() 
     .')', 
     'tmp') 
    ->execute() 
    ->fetch(\PDO::FETCH_COLUMN); 

我不知道学说ORM如何处理这一点,但在纯DBAL至少这似乎工作。