Доктрина - Как распечатать настоящий sql, а не только подготовленное заявление? - PullRequest
148 голосов
/ 19 января 2010

Мы используем Doctrine, PHP ORM. Я создаю запрос как этот:

$q = Doctrine_Query::create()->select('id')->from('MyTable');

, а затем в функцию, которую я добавляю, в различных выражениях where и прочем, в зависимости от ситуации, например,

$q->where('normalisedname = ? OR name = ?', array($string, $originalString));

Позже, перед тем, как execute() -изложить этот объект запроса, я хочу распечатать необработанный SQL, чтобы изучить его, и сделать это:

$q->getSQLQuery();

Однако это выводит только подготовленный оператор, а не полный запрос. Я хочу посмотреть, что он отправляет в MySQL, но вместо этого он печатает подготовленный оператор, включая ?. Есть ли способ увидеть «полный» запрос?

Ответы [ 15 ]

4 голосов
/ 21 марта 2014
Solution:1
====================================================================================

function showQuery($query)
{
    return sprintf(str_replace('?', '%s', $query->getSql()), $query->getParams());
}

// call function  
echo showQuery($doctrineQuery);

Solution:2
====================================================================================

function showQuery($query)
{
    // define vars              
    $output    = NULL;
    $out_query = $query->getSql();
    $out_param = $query->getParams();

    // replace params
   for($i=0; $i<strlen($out_query); $i++) {
       $output .= ( strpos($out_query[$i], '?') !== FALSE ) ? "'" .str_replace('?', array_shift($out_param), $out_query[$i]). "'" : $out_query[$i];
   }

   // output
   return sprintf("%s", $output);
}

// call function  
echo showQuery($doctrineQueryObject);
4 голосов
/ 23 января 2013

Может быть кому-то это пригодится:

// Printing the SQL with real values
$vals = $query->getFlattenedParams();
foreach(explode('?', $query->getSqlQuery()) as $i => $part) {
    $sql = (isset($sql) ? $sql : null) . $part;
    if (isset($vals[$i])) $sql .= $vals[$i];
}

echo $sql;
1 голос
/ 30 ноября 2018
$sql = $query->getSQL();

$parameters = [];
    foreach ($query->getParameters() as $parameter) {
        $parameters[] = $parameter->getValue();
    }

$result = $connection->executeQuery($sql, $parameters)
        ->fetchAll();
1 голос
/ 13 августа 2015

Я написал простой регистратор, который может регистрировать запросы со вставленными параметрами.Установка:

composer require cmyker/doctrine-sql-logger:dev-master

Использование:

$connection = $this->getEntityManager()->getConnection(); 
$logger = new \Cmyker\DoctrineSqlLogger\Logger($connection);
$connection->getConfiguration()->setSQLLogger($logger);
//some query here
echo $logger->lastQuery;
0 голосов
/ 27 января 2015

Чтобы распечатать запрос SQL в Doctrine, используйте:

$query->getResult()->getSql();
...