/
InlineParameterFormatter.php
83 lines (67 loc) · 2.16 KB
/
InlineParameterFormatter.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
declare(strict_types=1);
namespace Doctrine\Migrations;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Types\Type;
use function array_map;
use function implode;
use function is_array;
use function is_bool;
use function is_float;
use function is_int;
use function is_string;
use function sprintf;
/**
* The InlineParameterFormatter class is responsible for formatting SQL query parameters to a string
* for display output.
*
* @internal
*/
final class InlineParameterFormatter implements ParameterFormatter
{
public function __construct(private readonly Connection $connection)
{
}
/**
* @param mixed[] $params
* @param mixed[] $types
*/
public function formatParameters(array $params, array $types): string
{
if ($params === []) {
return '';
}
$formattedParameters = [];
foreach ($params as $key => $value) {
$type = $types[$key] ?? 'string';
$formattedParameter = '[' . $this->formatParameter($value, $type) . ']';
$formattedParameters[] = is_string($key)
? sprintf(':%s => %s', $key, $formattedParameter)
: $formattedParameter;
}
return sprintf('with parameters (%s)', implode(', ', $formattedParameters));
}
private function formatParameter(mixed $value, mixed $type): string|int|bool|float|null
{
if (is_string($type) && Type::hasType($type)) {
return Type::getType($type)->convertToDatabaseValue(
$value,
$this->connection->getDatabasePlatform(),
);
}
return $this->parameterToString($value);
}
/** @param int[]|bool[]|string[]|float[]|array|int|string|float|bool $value */
private function parameterToString(array|int|string|float|bool $value): string
{
if (is_array($value)) {
return implode(', ', array_map($this->parameterToString(...), $value));
}
if (is_int($value) || is_string($value) || is_float($value)) {
return (string) $value;
}
if (is_bool($value)) {
return $value === true ? 'true' : 'false';
}
}
}