1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* webtrees: online genealogy |
5
|
|
|
* Copyright (C) 2024 webtrees development team |
6
|
|
|
* This program is free software: you can redistribute it and/or modify |
7
|
|
|
* it under the terms of the GNU General Public License as published by |
8
|
|
|
* the Free Software Foundation, either version 3 of the License, or |
9
|
|
|
* (at your option) any later version. |
10
|
|
|
* This program is distributed in the hope that it will be useful, |
11
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
12
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13
|
|
|
* GNU General Public License for more details. |
14
|
|
|
* You should have received a copy of the GNU General Public License |
15
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>. |
16
|
|
|
*/ |
17
|
|
|
|
18
|
|
|
declare(strict_types=1); |
19
|
|
|
|
20
|
|
|
namespace Fisharebest\Webtrees; |
21
|
|
|
|
22
|
|
|
use Illuminate\Database\Capsule\Manager as DB; |
|
|
|
|
23
|
|
|
use Illuminate\Database\Query\Expression; |
24
|
|
|
|
25
|
|
|
/** |
26
|
|
|
* SQL GROUP_CONCAT function. |
27
|
|
|
*/ |
28
|
|
|
class GroupConcat extends Expression |
29
|
|
|
{ |
30
|
|
|
public function __construct(string $expression, string $separator = ',', string $order_by = '', string $alias = '') |
31
|
|
|
{ |
32
|
|
|
$quoted_expression = DB::getTheConnection()->getSchemaGrammar()->wrap($expression); |
33
|
|
|
$quoted_separator = DB::getTheConnection()->getPdo()->quote($separator); |
34
|
|
|
$quoted_order_by = DB::getTheConnection()->getSchemaGrammar()->wrap($order_by); |
35
|
|
|
|
36
|
|
|
switch (DB::getTheConnection()->getDriverName()) { |
37
|
|
|
case 'sqlsrv': |
38
|
|
|
$sql = 'STRING_AGG(' . $quoted_expression . ',' . $quoted_separator . ') WITHIN GROUP (ORDER BY ' . $quoted_order_by . ' ASC)'; |
39
|
|
|
break; |
40
|
|
|
default: |
41
|
|
|
$sql = 'GROUP_CONCAT(' . $quoted_expression . ',' . $quoted_separator . ' ORDER BY ' . $quoted_order_by . ')'; |
42
|
|
|
break; |
43
|
|
|
} |
44
|
|
|
|
45
|
|
|
if ($alias !== '') { |
46
|
|
|
$sql .= ' AS ' . DB::getTheConnection()->getSchemaGrammar()->wrap($alias); |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
parent::__construct($sql); |
50
|
|
|
} |
51
|
|
|
} |
52
|
|
|
|
Let?s assume that you have a directory layout like this:
and let?s assume the following content of
Bar.php
:If both files
OtherDir/Foo.php
andSomeDir/Foo.php
are loaded in the same runtime, you will see a PHP error such as the following:PHP Fatal error: Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php
However, as
OtherDir/Foo.php
does not necessarily have to be loaded and the error is only triggered if it is loaded beforeOtherDir/Bar.php
, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias: