|
6 | 6 |
|
7 | 7 | class Helper
|
8 | 8 | {
|
9 |
| - public static function getColumnAliases($qbSelect) |
| 9 | + public static function getColumnAliases($queryBuilder, $config) |
10 | 10 | {
|
11 |
| - if (empty($qbSelect)) return []; |
| 11 | + $queryBuilderClone = clone $queryBuilder; |
| 12 | + $compiledSelect = $queryBuilderClone->{$config->get('getCompiledSelect')}(); |
12 | 13 |
|
13 |
| - $sql = 'SELECT '.implode(', ', $qbSelect); |
14 | 14 | $parser = new PHPSQLParser();
|
15 |
| - $parsed = $parser->parse($sql); |
| 15 | + $parsed = $parser->parse($compiledSelect); |
| 16 | + |
| 17 | + $tableAliases = []; |
| 18 | + foreach ($parsed['FROM'] as $from) { |
| 19 | + if ($from['expr_type'] === 'table') { |
| 20 | + $name = $from['no_quotes']['parts'][0]; |
| 21 | + $alias = isset($from['alias']['name']) ? $from['alias']['no_quotes']['parts'][0] : $name; |
| 22 | + $tableAliases[$alias] = $name; |
| 23 | + } |
| 24 | + } |
16 | 25 |
|
17 | 26 | $columnAliases = [];
|
18 | 27 | foreach ($parsed['SELECT'] as $select) {
|
19 |
| - if ($select['alias']) { |
20 |
| - $alias = $select['alias']['name']; |
21 |
| - if ($select['expr_type'] == 'colref') { |
22 |
| - $key = $select['base_expr']; |
23 |
| - } elseif (strpos($select['expr_type'], 'function') !== FALSE) { |
| 28 | + $expr_type = $select['expr_type']; |
| 29 | + $base_expr = $select['base_expr']; |
| 30 | + |
| 31 | + if (isset($select['alias']['name'])) { |
| 32 | + $alias = $select['alias']['no_quotes']['parts'][0]; |
| 33 | + |
| 34 | + if ($expr_type === 'colref') { |
| 35 | + $key = implode('.', $select['no_quotes']['parts']); |
| 36 | + } elseif ($expr_type === 'expression') { |
| 37 | + $key = trim(str_replace($alias, '', $base_expr)); |
| 38 | + } elseif (str_contains($expr_type, 'function')) { |
24 | 39 | $parts = [];
|
25 | 40 | foreach ($select['sub_tree'] as $part) {
|
26 | 41 | $parts[] = $part['base_expr'];
|
27 | 42 | }
|
28 |
| - $key = $select['base_expr'].'('.implode(', ', $parts).')'; |
| 43 | + $key = $base_expr . '(' . implode(', ', $parts) . ')'; |
29 | 44 | }
|
30 | 45 | $columnAliases[$alias] = $key;
|
| 46 | + } elseif ($expr_type === 'colref') { |
| 47 | + if (str_contains($base_expr, '*')) { |
| 48 | + if (str_contains($base_expr, '.')) { |
| 49 | + $tableAlias = $select['no_quotes']['parts'][0]; |
| 50 | + } else { |
| 51 | + $tableAlias = array_key_first($tableAliases); |
| 52 | + } |
| 53 | + |
| 54 | + $tableName = $tableAliases[$tableAlias]; |
| 55 | + $fields = $queryBuilder->{$config->get('getFieldNames')}($tableName); |
| 56 | + foreach ($fields as $field) { |
| 57 | + $key = "{$tableAlias}.{$field}"; |
| 58 | + $columnAliases[$field] = $key; |
| 59 | + } |
| 60 | + } elseif (str_contains($base_expr, '.')) { |
| 61 | + $field = $select['no_quotes']['parts'][1]; |
| 62 | + $key = implode('.', $select['no_quotes']['parts']); |
| 63 | + $columnAliases[$field] = $key; |
| 64 | + } |
31 | 65 | }
|
32 | 66 | }
|
33 | 67 |
|
|
0 commit comments