2015-11-23 69 views
2

我有這個查詢子查詢。如何使用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

回答

1

我最近需要做到這一點來實現分頁/排序助手。作爲其中的一部分,我將採用由我的模型執行的查詢構建器,並統一計算在無限制時將產生的總行數。

要跨平臺我不能使用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至少這似乎工作。

相關問題