PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.20.0
GiveWP – Donation Plugin and Fundraising Platform v2.20.0
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Framework / QueryBuilder / Concerns / MetaQuery.php
give / src / Framework / QueryBuilder / Concerns Last commit date
Aggregate.php 4 years ago CRUD.php 4 years ago FromClause.php 4 years ago GroupByStatement.php 4 years ago HavingClause.php 4 years ago JoinClause.php 4 years ago LimitStatement.php 4 years ago MetaQuery.php 4 years ago OffsetStatement.php 4 years ago OrderByStatement.php 4 years ago SelectStatement.php 4 years ago TablePrefix.php 4 years ago UnionOperator.php 4 years ago WhereClause.php 4 years ago
MetaQuery.php
140 lines
1 <?php
2
3 namespace Give\Framework\QueryBuilder\Concerns;
4
5 use Give\Framework\QueryBuilder\JoinQueryBuilder;
6 use Give\Framework\QueryBuilder\Clauses\MetaTable;
7 use Give\Framework\QueryBuilder\Clauses\RawSQL;
8 use Give\Framework\QueryBuilder\QueryBuilder;
9
10 /**
11 * @since 2.19.0
12 */
13 trait MetaQuery
14 {
15
16 /**
17 * @var MetaTable[]
18 */
19 private $metaTablesConfigs = [];
20
21 /**
22 * @var string
23 */
24 private $defaultMetaKeyColumn = 'meta_key';
25
26 /**
27 * @var string
28 */
29 private $defaultMetaValueColumn = 'meta_value';
30
31 /**
32 * @param string|RawSQL $table
33 * @param string $metaKeyColumn
34 * @param string $metaValueColumn
35 *
36 * @return $this
37 */
38 public function configureMetaTable($table, $metaKeyColumn, $metaValueColumn)
39 {
40 $this->metaTablesConfigs[] = new MetaTable(
41 $table,
42 $metaKeyColumn,
43 $metaValueColumn
44 );
45
46 return $this;
47 }
48
49 /**
50 * @param string|RawSQL $table
51 *
52 * @return MetaTable
53 */
54 protected function getMetaTable($table)
55 {
56 $tableName = QueryBuilder::prefixTable($table);
57
58 foreach ($this->metaTablesConfigs as $metaTable) {
59 if ($metaTable->tableName === $tableName) {
60 return $metaTable;
61 }
62 }
63
64 return new MetaTable(
65 $table,
66 $this->defaultMetaKeyColumn,
67 $this->defaultMetaValueColumn
68 );
69 }
70
71 /**
72 * Select meta columns
73 *
74 * @param string|RawSQL $table
75 * @param string $foreignKey
76 * @param string $primaryKey
77 * @param array $columns
78 *
79 * @return $this
80 */
81 public function attachMeta($table, $foreignKey, $primaryKey, ...$columns)
82 {
83 $groupConcat = false;
84 $metaTable = $this->getMetaTable($table);
85
86 // Check if we have meta columns that dev wants to group concat
87 foreach ($columns as $definition) {
88 if (is_array($definition)) {
89 list (, , $concat) = array_pad($definition, 3, false);
90 if ($concat) {
91 $groupConcat = true;
92 // Include foreign key so that dev doesn't have to
93 // he will be confused why he needs this if we don't do it for him, and we also want to prevent errors if sql_mode is only_full_group_by
94 $this->groupBy($foreignKey);
95 break;
96 }
97 }
98 }
99
100 foreach ($columns as $i => $definition) {
101 if (is_array($definition)) {
102 list ($column, $columnAlias, $concat) = array_pad($definition, 3, false);
103 } else {
104 $column = $definition;
105 $columnAlias = $concat = false;
106 }
107
108 // Set dynamic alias
109 $tableAlias = sprintf('%s_%s_%d', ($table instanceof RawSQL) ? $table->sql : $table, 'attach_meta', $i);
110
111 if ($concat) {
112 $this->selectRaw(
113 "CONCAT('[',GROUP_CONCAT(DISTINCT CONCAT('\"',%1s,'\"')),']') AS %2s",
114 $tableAlias . '.' . $metaTable->valueColumnName,
115 $columnAlias ?: $column
116 );
117 } else {
118 $this->select(["{$tableAlias}.{$metaTable->valueColumnName}", $columnAlias ?: $column]);
119 }
120
121 $this->join(
122 function (JoinQueryBuilder $builder) use ($table, $foreignKey, $primaryKey, $tableAlias, $column, $metaTable) {
123 $builder
124 ->leftJoin($table, $tableAlias)
125 ->on($foreignKey, "{$tableAlias}.{$primaryKey}")
126 ->andOn("{$tableAlias}.{$metaTable->keyColumnName}", $column, true);
127 }
128 );
129
130 // If this is non-aggregate column - we have to include it in the GROUP BY statement
131 // otherwise the query will fail on servers that have sql_mode flag set to only_full_group_by
132 if ($groupConcat && !$concat) {
133 $this->groupBy($columnAlias ?: $column);
134 }
135 }
136
137 return $this;
138 }
139 }
140