/**
* @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];
});
}