Получите сырой sql из построителя запросов Phalcon

Можно ли извлечь необработанный sql-запрос из экземпляра построителя запроса в Phalcon? Что-то вроде этого?

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

$rawSql = $queryBuilder->hypotheticalGetRawQueryMethod();

Ответ 1

По ошибке и испытанию, похоже, работает. Было бы здорово, если бы кто-то мог подтвердить, есть ли лучший способ.

$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()

Ответ 2

вы можете использовать getRealSqlStatement() (или подобное имя функции) в DbAdapter. См. http://docs.phalconphp.com/en/latest/api/Phalcon_Db_Adapter.html

В соответствии с документацией вы можете получить полученный SQL-запрос.

Или подождите, это может не работать на querybuilder. В противном случае вы можете настроить ведение журнала низкого уровня: http://docs.phalconphp.com/en/latest/reference/models.html#logging-low-level-sql-statements

Ответ 3

$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);
}

Подробнее вы можете прочитать там

Ответ 4

Если вы используете построитель запросов, то, как указано ниже, функция getPhql может служить цели согласно версии phalcon 3.4.4.


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