Как просмотреть параметры в запросе?
Чтобы отладить мой код, я хотел бы видеть явный 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.
И вуаля!