Doctrine - How to print out the real sql, not just the prepared statement?

后端 未结 19 2474
自闭症患者
自闭症患者 2020-11-30 18:59

We\'re using Doctrine, a PHP ORM. I am creating a query like this:

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

19条回答
  •  旧时难觅i
    2020-11-30 19:57

    $sql = $query->getSQL();
    $obj->mapDQLParametersNamesToSQL($query->getDQL(), $sql);
    echo $sql;//to see parameters names in sql
    $obj->mapDQLParametersValuesToSQL($query->getParameters(), $sql);
    echo $sql;//to see parameters values in sql
    
    public function mapDQLParametersNamesToSQL($dql, &$sql)
    {
        $matches = [];
        $parameterNamePattern = '/:\w+/';
        /** Found parameter names in DQL */
        preg_match_all($parameterNamePattern, $dql, $matches);
        if (empty($matches[0])) {
            return;
        }
        $needle = '?';
        foreach ($matches[0] as $match) {
            $strPos = strpos($sql, $needle);
            if ($strPos !== false) {
                /** Paste parameter names in SQL */
                $sql = substr_replace($sql, $match, $strPos, strlen($needle));
            }
        }
    }
    
    public function mapDQLParametersValuesToSQL($parameters, &$sql)
    {
        $matches = [];
        $parameterNamePattern = '/:\w+/';
        /** Found parameter names in SQL */
        preg_match_all($parameterNamePattern, $sql, $matches);
        if (empty($matches[0])) {
            return;
        }
        foreach ($matches[0] as $parameterName) {
            $strPos = strpos($sql, $parameterName);
            if ($strPos !== false) {
                foreach ($parameters as $parameter) {
                    /** @var \Doctrine\ORM\Query\Parameter $parameter */
                    if ($parameterName !== ':' . $parameter->getName()) {
                        continue;
                    }
                    $parameterValue = $parameter->getValue();
                    if (is_string($parameterValue)) {
                        $parameterValue = "'$parameterValue'";
                    }
                    if (is_array($parameterValue)) {
                        foreach ($parameterValue as $key => $value) {
                            if (is_string($value)) {
                                $parameterValue[$key] = "'$value'";
                            }
                        }
                        $parameterValue = implode(', ', $parameterValue);
                    }
                    /** Paste parameter values in SQL */
                    $sql = substr_replace($sql, $parameterValue, $strPos, strlen($parameterName));
                }
            }
        }
    }
    

提交回复
热议问题