protected Query::loadRecords()
Loads the config records to examine for the query.
Return value
array Config records keyed by entity IDs.
File
- core/lib/Drupal/Core/Config/Entity/Query/Query.php, line 120
Class
- Query
- Defines the entity query for configuration entities.
Namespace
Drupal\Core\Config\Entity\Query
Code
protected function loadRecords() { $prefix = $this->entityType->getConfigPrefix() . '.'; $prefix_length = strlen($prefix); // Search the conditions for restrictions on configuration object names. $names = FALSE; $id_condition = NULL; $id_key = $this->entityType->getKey('id'); if ($this->condition->getConjunction() == 'AND') { $lookup_keys = $this->entityType->getLookupKeys(); $conditions = $this->condition->conditions(); foreach ($conditions as $condition_key => $condition) { $operator = $condition['operator'] ? : (is_array($condition['value']) ? 'IN' : '='); if (is_string($condition['field']) && ($operator == 'IN' || $operator == '=')) { // Special case ID lookups. if ($condition['field'] == $id_key) { $ids = (array) $condition['value']; $names = array_map(function($id) use ($prefix) { return $prefix . $id; }, $ids); } elseif (in_array($condition['field'], $lookup_keys)) { // If we don't find anything then there are no matches. No point in // listing anything. $names = array(); $keys = (array) $condition['value']; $keys = array_map(function($value) use ($condition) { return $condition['field'] . ':' . $value; }, $keys); foreach ($this->getConfigKeyStore()->getMultiple($keys) as $list) { $names = array_merge($names, $list); } } } // Save the first ID condition that is not an 'IN' or '=' for narrowing // down later. elseif (!$id_condition && $condition['field'] == $id_key) { $id_condition = $condition; } // We stop at the first restricting condition on name. In the case where // there are additional restricting conditions, results will be // eliminated when the conditions are checked on the loaded records. if ($names !== FALSE) { // If the condition has been responsible for narrowing the list of // configuration to check there is no point in checking it further. unset($conditions[$condition_key]); break; } } } // If no restrictions on IDs were found, we need to parse all records. if ($names === FALSE) { $names = $this->configFactory->listAll($prefix); } // In case we have an ID condition, try to narrow down the list of config // objects to load. if ($id_condition && !empty($names)) { $value = $id_condition['value']; $filter = NULL; switch ($id_condition['operator']) { case '<>': $filter = function($name) use ($value, $prefix_length) { $id = substr($name, $prefix_length); return $id !== $value; }; break; case 'STARTS_WITH': $filter = function($name) use ($value, $prefix_length) { $id = substr($name, $prefix_length); return strpos($id, $value) === 0; }; break; case 'CONTAINS': $filter = function($name) use ($value, $prefix_length) { $id = substr($name, $prefix_length); return strpos($id, $value) !== FALSE; }; break; case 'ENDS_WITH': $filter = function($name) use ($value, $prefix_length) { $id = substr($name, $prefix_length); return strrpos($id, $value) === strlen($id) - strlen($value); }; break; } if ($filter) { $names = array_filter($names, $filter); } } // Load the corresponding records. $records = array(); foreach ($this->configFactory->loadMultiple($names) as $config) { $records[substr($config->getName(), $prefix_length)] = $config->get(); } return $records; }
Please login to continue.