Как просмотреть параметры в запросе?

Чтобы отладить мой код, я хотел бы видеть явный SQL-запрос, который выполняется.

Я создаю запрос с помощью createQueryBuilder, и наиболее явная вещь, которую я достиг, заключается в том, что необработанный запрос используется:

$qb->getQuery()->getSQL();

Проблема заключается в том, что вместо параметров я вижу держатели (?). Я нашел некоторые решения в Интернете, но они для 1.3 и 1.4, ничего для Symfony-2.

Идеи? Спасибо!

Ответ 1

Вы можете получить доступ к параметрам, используемым заполнителями, используя $query->getParameters(), чтобы вы могли отлаживать ваш запрос, используя:

$query = $qb->getQuery();
print_r(array(
    'sql'        => $query->getSQL(),
    'parameters' => $query->getParameters(),
));

Ответ 2

Вы можете легко получить доступ к параметрам SQL, используя следующий подход.

   $result = $qb->getQuery()->getSQL();

   $param_values = '';  
   $col_names = '';   

   foreach ($result->getParameters() as $index => $param){              
            $param_values .= $param->getValue().',';
            $col_names .= $param->getName().',';
   } 

   //echo rtrim($param_values,',');
   //echo rtrim($col_names,',');    

Итак, если вы напечатали $param_values и $col_names, вы можете получить значения параметров, проходящие через имена sql и соответствующих столбцов.

Примечание. Если $param возвращает массив, вам нужно повторить его, поскольку параметры внутри IN (:?) обычно появляются как вложенный массив.

Тем временем, если вы нашли другой подход, пожалуйста, будьте любезны поделиться с нами:)

Спасибо!

Ответ 3

Мне пришлось создать объединение реквитов (невозможно с DQL или QueryBuilder) с 5 запросами, уже построенными с QueryBuilder. Поэтому я повторно использую эти запросы, но у меня возникла проблема с использованием функции getParameters(), потому что она дает параметр в том же порядке, который вы ему дали. Одно из преимуществ при использовании построителя запросов - вы можете создать запрос, если хотите, но когда вы извлекаете параметры, вы можете получить его в беспорядочном режиме. чтобы избежать этого, я создал следующую функцию:

    $getSqlWithParams = \Closure::bind(function(){
        return [$this->getSql(), $this->processParameterMappings($this->_parserResult->getParameterMappings())];
    }, null, Query::class);

теперь, когда вы хотите получить sql и отсортированные параметры:

$getSqlWithParams()->call($query)

Не забывайте использовать инструкцию \Doctrine\ORM\Query. И вуаля!