2013-12-17 26 views
0

我有一個簡單的查詢來選擇實體並使用限制語句。我正在使用Doctrine NativeQuery,因爲我在sql查詢中有FIELD()函數,並且我需要一組對象作爲結果。 該查詢起作用。使用'SQL_CALC_FOUND_ROWS'和Doctrine NativeQuery來獲取總行數

但是我還需要記錄的總數,所以我在第一個查詢中使用了SQL_CALC_FOUND_ROWS。第一次得到結果後,我創建另一個ResultSetMapping,另一個$ nativeQuery,執行SELECT FOUND_ROWS() AS found_rows,我總是獲得總數爲'1'。

$rsm = new ResultSetMapping(); 

$rsm->addEntityResult('\\MyCompany\\Administration\\Domain\\Model\\Applicant\\Applicant', 'a'); 

$rsm->addFieldResult('a', 'first_name', 'firstName'); 
$rsm->addFieldResult('a', 'last_name', 'lastName'); 

$query = $this->em->createNativeQuery('SELECT SQL_CALC_FOUND_ROWS * FROM recruitment_applicant ORDER BY FIELD(id,5,15,8,17,2,1,16,9,7,11,6,10,12,13,14,18)', $rsm); 

$result = $query->getResult(); // this result is ok 



$sqlCountRows = "SELECT FOUND_ROWS() AS found_rows"; 

$countRowsRsm = new ResultSetMapping(); 

$countRowsRsm->addScalarResult('found_rows', 'foundRows'); 

$countRowsQuery = $this->em->createNativeQuery($sqlCountRows,$countRowsRsm); 

$rowsCount = $countRowsQuery->getResult(); 

$total = $rowsCount[0]['foundRows']; // result is '1' when it should be '16' 

我用this的例子。

回答

2
  1. 您不必使用本機查詢。 FIELD()真的是很容易實現的自定義功能DQL:

    1. 閱讀DQL User Defined FunctionsHow to Register Custom DQL Functions的學說/ Symfony的文檔。
    2. FIELD()實現:

      use Doctrine\ORM\Query\AST\Functions\FunctionNode; 
      use Doctrine\ORM\Query\Lexer; 
      use Doctrine\ORM\Query\Parser; 
      use Doctrine\ORM\Query\SqlWalker; 
      
      class Field extends FunctionNode 
      { 
          private $field = null; 
          private $values = array(); 
      
          public function parse(Parser $parser) 
          { 
           $parser->match(Lexer::T_IDENTIFIER); 
           $parser->match(Lexer::T_OPEN_PARENTHESIS); 
      
           $this->field = $parser->arithmeticPrimary(); 
      
           while (count($this->values) < 1 || $parser->getLexer()->lookahead['type'] !== Lexer::T_CLOSE_PARENTHESIS) { 
            $parser->match(Lexer::T_COMMA); 
            $this->values[] = $parser->arithmeticPrimary(); 
           } 
      
           $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
          } 
      
          public function getSql(SqlWalker $sqlWalker) 
          { 
           $values = array(); 
           foreach ($this->values as $value) { 
            $values[] = $value->dispatch($sqlWalker); 
           } 
      
           return sprintf('FIELD(%s, %s)', $this->field->dispatch($sqlWalker), implode(', ', $values)); 
          } 
      } 
      
  2. 你不會需要事件的計數查詢。但是,如果您需要COUNT(*)查詢,則可以輕鬆克隆原始查詢並使用CountWalker從選擇查詢創建計數查詢。

0

我找到了什麼可能是問題的原因:Symfony2分析器,查詢部分,顯示總共執行22個查詢。我的第一個查詢會連續第三次運行,而我的第二個查詢將返回執行第13行的行數。 SQL_CALC_FOUND_ROWS如果SELECT FOUND_ROWS()在第一個查詢後立即運行,則可以使用。