/** * @param string $query * @param array $params * @param array $types * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform * @throws \Doctrine\DBAL\DBALException * @throws \Nette\Utils\RegexpException * @return string */ public static function formatQuery($query, $params, array $types = [], AbstractPlatform $platform = NULL) { if (!$platform) { $platform = new Doctrine\DBAL\Platforms\MySqlPlatform(); } if (!$types) { foreach ($params as $key => $param) { if (is_array($param)) { $types[$key] = Doctrine\DBAL\Connection::PARAM_STR_ARRAY; } else { $types[$key] = 'string'; } } } try { list($query, $params, $types) = \Doctrine\DBAL\SQLParserUtils::expandListParameters($query, $params, $types); } catch (Doctrine\DBAL\SQLParserUtilsException $e) { } $formattedParams = []; foreach ($params as $key => $param) { if (isset($types[$key])) { if (is_scalar($types[$key]) && array_key_exists($types[$key], Type::getTypesMap())) { $types[$key] = Type::getType($types[$key]); } /** @var Type[] $types */ if ($types[$key] instanceof Type) { $param = $types[$key]->convertToDatabaseValue($param, $platform); } } $formattedParams[] = SimpleParameterFormatter::format($param); } $params = $formattedParams; if (Nette\Utils\Validators::isList($params)) { $parts = explode('?', $query); if (count($params) > $parts) { throw new Kdyby\Doctrine\InvalidStateException("Too mny parameters passed to query."); } return implode('', Kdyby\Doctrine\Helpers::zipper($parts, $params)); } return Strings::replace($query, '~(\\:[a-z][a-z0-9]*|\\?[0-9]*)~i', function ($m) use(&$params) { if (substr($m[0], 0, 1) === '?') { if (strlen($m[0]) > 1) { if (isset($params[$k = substr($m[0], 1)])) { return $params[$k]; } } else { return array_shift($params); } } else { if (isset($params[$k = substr($m[0], 1)])) { return $params[$k]; } } return $m[0]; }); }