19declare(strict_types=1);
43 private readonly
string $user_base_table_name,
44 private readonly
string $user_values_table_name,
47 $this->cnt_query_init =
'SELECT COUNT(DISTINCT ' . $this->user_base_table_name
48 .
'.usr_id) cnt FROM ' . $this->user_base_table_name;
49 $this->select_fields = array_map(
50 fn(
string $v):
string => $this->user_base_table_name .
'.' . $v,
58 $clone->select_fields[] = $field_name;
65 $clone->select_fields[] = $this->user_base_table_name .
'.' . $field_name;
72 $clone->udf_fields[] = $field;
79 $clone->multi_fields[] = $field_name;
86 $clone->join[] =
$join;
99 if (is_array($value)) {
100 $value_query = $this->db->in($this->user_values_table_name .
'.value', $value,
false, \
ilDBConstants::T_TEXT);
102 $value_query = $this->db->like($this->user_values_table_name .
'.value', \
ilDBConstants::T_TEXT,
"%{$value}%");
104 $clone = clone $this;
105 $clone->where[] = $this->user_values_table_name .
".field_id = '{$identifier}' AND {$value_query}";
111 $clone = clone $this;
118 $clone = clone $this;
119 $clone->order =
"ORDER BY `{$order_field}` {$direction}";
125 $clone = clone $this;
126 $clone->order =
'ORDER BY ' . implode(
', ', array_reduce(
128 function (array
$c,
string $v) use ($direction): array {
129 $c[] = $this->user_base_table_name .
".`{$v}` {$direction}";
142 $clone = clone $this;
149 $clone = clone $this;
151 $clone->multi_data_table_joined =
true;
157 return self::RECORDS_QUERY_INIT . implode(
', ', $this->select_fields) . PHP_EOL
158 .
'FROM usr_data' . PHP_EOL
159 . implode(PHP_EOL, $this->join) . PHP_EOL
162 .
'GROUP BY ' . $this->user_base_table_name .
'.usr_id' . PHP_EOL
168 return $this->cnt_query_init . PHP_EOL
169 . implode(PHP_EOL, $this->join) . PHP_EOL
176 if ($this->additional_fields_processed
177 || $this->multi_fields === [] && $this->udf_fields === []) {
181 $clone = clone $this;
182 if (!$this->multi_data_table_joined) {
184 $clone->multi_data_table_joined =
true;
187 foreach ($this->multi_fields as $field) {
188 $clone->select_fields[] =
'GROUP_CONCAT(DISTINCT IF(' . $this->user_values_table_name
189 .
".field_id = {$this->db->quote($field, \ilDBConstants::T_TEXT)}, "
190 . $this->user_values_table_name .
'.value, NULL) '
191 .
"SEPARATOR '" . self::ARRAY_SEPARATOR .
"') `{$field}`";
194 foreach ($this->udf_fields as $field) {
195 $clone->select_fields[] =
'GROUP_CONCAT(DISTINCT IF(' . $this->user_values_table_name
196 .
".field_id = {$this->db->quote($field->getIdentifier(), \ilDBConstants::T_TEXT)}, "
197 . $this->user_values_table_name .
'.value, NULL) '
198 .
"SEPARATOR '" . self::ARRAY_SEPARATOR .
"') `udf_{$field->getIdentifier()}`";
201 $clone->additional_fields_processed =
true;
208 static function (mixed $v): mixed {
209 if (!is_string($v) || mb_stristr($v, self::ARRAY_SEPARATOR) ===
false) {
213 return explode(self::ARRAY_SEPARATOR, $v);
221 if ($this->where === []) {
224 return 'AND ' . implode(PHP_EOL .
'AND ', $this->where) . PHP_EOL;
229 return 'LEFT JOIN ' . $this->user_values_table_name .
' ON '
230 . $this->user_values_table_name .
'.usr_id = ' . $this->user_base_table_name .
'.usr_id';
withAdditionalSelectAndJoinForUdfAndMultiValueFields()
__construct(private readonly \ilDBInterface $db, private readonly string $user_base_table_name, private readonly string $user_values_table_name, array $select_fields)
buildJoinForMultiDataTable()
withJoinedMultiDataTable()
const string ARRAY_SEPARATOR
withAdditionalDefaultTableSelectField(string $field_name)
withMultiDataTableOrder(string $order_field, string $direction)
withDefaultTableOrderFields(array $order_fields, string $direction)
withAdditionalWhere(string $where)
withAdditionalMultiField(string $field_name)
buildRecordsQueryString()
explodeArrayValues(array $row)
bool $multi_data_table_joined
const string RECORDS_QUERY_INIT
withLimitedUsers(array $users)
bool $additional_fields_processed
withAdditionalUdfField(Field $field)
withAdditionalJoin(string $join)
withAdditionalMultiDataWhere(string $identifier, string|array $value)
withAdditionalTableOrder(string $order)
withAdditionalAdditionalTableSelectField(string $field_name)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...