2014-01-24 55 views
9

是否可以從Phalcon中的查詢生成器實例中提取原始sql查詢?像這樣?從Phalcon查詢生成器中獲取原始sql

$queryBuilder = new Phalcon\Mvc\Model\Query\Builder(); 
$queryBuilder 
    ->from(…) 
    ->where(…); 

$rawSql = $queryBuilder->hypotheticalGetRawQueryMethod(); 

回答

11

通過錯誤和試驗下面似乎工作。如果有人能確認是否有更好的方法,那將會很棒。

$queryBuilder = new Builder(); 
$queryBuilder->from(…)->where(…); 

$intermediate = $queryBuilder->getQuery()->parse(); 
$dialect  = DI::getDefault()->get('db')->getDialect(); 
$sql   = $dialect->select($intermediate); 

編輯:作爲2.0.3你可以做到超級簡單,看comment的全部細節:

$modelsManager->createBuilder() 
    ->from('Some\Robots') 
    ->getQuery() 
    ->getSql() 
1
$db = Phalcon\DI::getDefault()->getDb(); 
$sql = $db->getSQLStatement(); 
$vars = $db->getSQLVariables(); 
if ($vars) { 
    $keys = array(); 
    $values = array(); 
    foreach ($vars as $placeHolder=>$var) { 
     // fill array of placeholders 
     if (is_string($placeHolder)) { 
      $keys[] = '/:'.ltrim($placeHolder, ':').'/'; 
     } else { 
      $keys[] = '/[?]/'; 
     } 
     // fill array of values 
     // It makes sense to use RawValue only in INSERT and UPDATE queries and only as values 
     // in all other cases it will be inserted as a quoted string 
     if ((strpos($sql, 'INSERT') === 0 || strpos($sql, 'UPDATE') === 0) && $var instanceof \Phalcon\Db\RawValue) { 
      $var = $var->getValue(); 
     } elseif (is_null($var)) { 
      $var = 'NULL'; 
     } elseif (is_numeric($var)) { 
      $var = $var; 
     } else { 
      $var = '"'.$var.'"'; 
     } 
     $values[] = $var; 
    } 
    $sql = preg_replace($keys, $values, $sql, 1); 
} 

更多,你可以閱讀there