2012-06-27 11 views
11

Aby debugować mój kod, chciałbym zobaczyć jawne zapytanie sql, które jest wykonywane.Jak wyświetlić parametry w zapytaniu?

utworzyć kwerendy z createQueryBuilder, a najbardziej wyraźny rzeczą, jaką osiąga się o zapytanie surowej przy użyciu:

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

Problem polega na tym, że zamiast parametrów widzę uchwytów (?). Znalazłem kilka rozwiązań w Internecie, ale są one dla wersji 1.3 i 1.4, nic dla Symfony-2.

Pomysły? Dzięki!

+3

W rzeczywistości twoje pytanie jest duplikatem tego http://stackoverflow.com/q/2095394/795876. Doctrine używa przygotowanej instrukcji, więc nigdy nie ma "prawdziwego" zapytania SQL po stronie PHP, a Doctrine nie może go wyświetlić. Jednak możesz przeczytać to rozwiązanie http://stackoverflow.com/a/10577703/795876 dla celów debugowania. – fsenart

+2

Ponadto, doktryna 2 ma klasę sqlLogger: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/configuration.html#sql-logger-optional – manix

+0

** fsehat ** - wygląda na to rozwiązanie jest dla Symfony 1.4, nie mogłem znaleźć w całym projekcie ani funkcji 'getSqlQuery', ani' getFlattenedParams' (która jest funkcją, której mi brakuje). ** manix ** - czy masz jakieś wzmianki o więcej dokumentacji, jak korzystać z rejestratora w Symfony 2.x? Wygląda to na dobre rozwiązanie, ale nie znajduję żadnej dobrej dokumentacji. ** Dzięki za oba! ** – guyaloni

Odpowiedz

27

Można uzyskać dostęp do parametrów wykorzystywanych przez zastępcze korzystających $query->getParameters(), więc można debugować zapytanie przy użyciu:

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

Zasadniczo jest to fajny pomysł.Problem polega na tym, że torba z parametrami może zawierać obiekty, a następnie próba wydrukowania daje ogromny ciąg. Chciałbym przekonwertować torbę parametrów zwracaną przez '$ query-> getParameters()' na tablicę ciągów znaków, które mogą zastąpić symbole zastępcze '?'. – guyaloni

+2

Myślę, że ta tablica jest już tablicą wartości skalarnych, jeśli spojrzysz na metodę setParameter https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L202, to call processParameterValue, która przekształca tablicę i obiekty na wartości skalarne https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L227 – AdrienBrault

+0

Zabawne, mam (o ile rozumiem) .) ostatnia wersja wszystkich dostawców, a moje 'AbstractQuery.php' i' Query.php' są trochę inne. Prawdopodobnie to, co mam, to Doctrine 2.1, podczas gdy ten kod to 2.2. W każdym razie dodałem metodę do mojego pliku 'Query.php', który zwraca surowe parametry sql +, oparte na twoich odpowiedziach. Dzięki! – guyaloni

2

można łatwo uzyskać dostęp do parametrów SQL przy użyciu następującej metody.

$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,',');  

Więc jeśli wydrukowana na $param_values i $col_names, można uzyskać wartości parametrów przechodzące przez SQL i nazwami kolumn.

Uwaga: Jeśli $param zwróci tablicę, należy ją powtórzyć, ponieważ parametry zwykle dostarczane w postaci IN (:?) są traktowane jako tablica zagnieżdżona.

Tymczasem jeśli znalazł innego podejścia, należy być na tyle uprzejmy, żeby podzielić się z nami :)

Dziękujemy!

0

Musiałem zbudować wymagane połączenie (niemożliwe z DQL lub QueryBuilder) z 5 zapytaniami, które zostały już zbudowane za pomocą QueryBuilder. Ponownie używam tych zapytań, ale miałem problem z używaniem funkcji getParameters(), ponieważ daje ona parametr w tej samej kolejności, w jakiej go podałeś. Jedną z zalet korzystania z kreatora zapytań jest możliwość tworzenia zapytań w kolejności, w jakiej chcesz, ale podczas pobierania parametrów możesz je odzyskać w nieładzie. tego uniknąć i mają wbudowane następujące funkcje:

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

teraz, gdy chcesz odzyskać SQL i posortowane parametry zrobić:

$getSqlWithParams()->call($query) 

Nie zapomnij użyć \ rachunku Doctrine \ ORM \ Query . I voila!

Powiązane problemy