Skip to content

Commit 1da1cd6

Browse files
authored
Merge pull request #2 from mag310/add-bind-tuple
Добавил тип bind-а для поддержки кортежей
2 parents 9d716e9 + b7ea1fb commit 1da1cd6

File tree

1 file changed

+53
-6
lines changed

1 file changed

+53
-6
lines changed

Parser.php

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,38 @@ private function simplifyParams($params)
7676
foreach ($params as $key => $value) {
7777
$key = ':' . ltrim($key, ':');
7878
if (is_array($value)) {
79-
if (isset($value[0]) && is_array($value[0])) {
80-
foreach ($value[0] as $valKey => $valVal) {
81-
$newParams[$key . '_' . $valKey] = $valVal;
82-
}
83-
} elseif (!isset($value['bind']) || $value['bind'] === true) {
79+
if (!isset($value['bind'])) {
80+
$value['bind'] = true;
81+
}
82+
83+
if ($value['bind'] === true) {
8484
if (isset($value[0]) && isset($value[1])) {
8585
$newParams[$key] = [$value[0], $value[1]];
8686
} elseif (isset($value[0])) {
8787
$newParams[$key] = $value[0];
8888
}
89+
} elseif ($value['bind'] === 'tuple') {
90+
91+
if (isset($value[0]) && is_array($value[0])) {
92+
//скинем индексы
93+
$value[0] = array_values($value[0]);
94+
95+
foreach ($value[0] as $valKey => $valVal) {
96+
if (is_array($valVal)) {
97+
foreach ($valVal as $k => $v) {
98+
$newParams[$key . '_' . $valKey . '_' . $k] = $v;
99+
}
100+
} else {
101+
$newParams[$key . '_' . $valKey] = $valVal;
102+
}
103+
}
104+
} elseif (isset($value[0])) {
105+
$newParams[$key] = $value[0];
106+
}
107+
} elseif (isset($value[0]) && is_array($value[0])) {
108+
foreach ($value[0] as $valKey => $valVal) {
109+
$newParams[$key . '_' . $valKey] = $valVal;
110+
}
89111
}
90112
} else {
91113
$newParams[$key] = $value;
@@ -152,6 +174,30 @@ private function replaceComment($comment, $queryInComment, $paramName)
152174
$queryInComment = preg_replace('/:@' . preg_quote($paramName) . '/', $replacement, $queryInComment);
153175
} elseif ($bind === 'text') {
154176
$queryInComment = preg_replace('/' . preg_quote($paramName) . '/', $value, $queryInComment);
177+
} elseif ($bind === 'tuple') {
178+
if (is_array($paramValue[0])) {
179+
$replacements = [];
180+
//скинем индексы
181+
$paramValue[0] = array_values($paramValue[0]);
182+
183+
foreach ($paramValue[0] as $keyParam => $val) {
184+
$name = ':' . $paramName . '_' . $keyParam;
185+
if (is_array($val)) {
186+
$valArr = [];
187+
foreach (array_keys($val) as $keyVal) {
188+
$valArr[] = $name . '_' . $keyVal;
189+
}
190+
$valName = implode(',', $valArr);
191+
} else {
192+
$valName = $name;
193+
}
194+
$replacements[] = '(' . $valName . ')';
195+
}
196+
$replacement = implode(',', $replacements);
197+
} else {
198+
$replacement = $paramValue;
199+
}
200+
$queryInComment = preg_replace('/:@' . preg_quote($paramName) . '/', $replacement, $queryInComment);
155201
}
156202
} else {
157203
$queryInComment = '';
@@ -163,7 +209,8 @@ private function replaceComment($comment, $queryInComment, $paramName)
163209
/**
164210
* Ищет параметр в массиве $this->params
165211
* @param string $name имя параметра
166-
* @return array|bool массив ['имя_параметра_без_ведущего_двоеточия', 'значение_параметра'] или ложь если параметра нет
212+
* @return array|bool массив ['имя_параметра_без_ведущего_двоеточия', 'значение_параметра'] или ложь если параметра
213+
* нет
167214
*/
168215
private function getParam($name)
169216
{

0 commit comments

Comments
 (0)