public function getFields($fields)
{
if ($fields != '*' && is_string($fields)) {
$fields = explode(',', str_replace(' ', '', trim($fields)));
}
$query = $this->getQueryClass();
/** @var TableMap $tableMap */
$tableMap = $query->getTableMap();
$fields2 = array();
$relations = array();
$relationFields = array();
$pluralizer = new StandardEnglishPluralizer();
foreach ($this->propelPrimaryKeys as $primaryKey) {
$fields2[$primaryKey->getPhpName()] = $primaryKey;
}
if ($fields == '*') {
$columns = $tableMap->getColumns();
foreach ($columns as $column) {
$fields2[$column->getPhpName()] = $column;
}
//add relations
$relationMap = $tableMap->getRelations();
foreach ($relationMap as $relationName => $relation) {
if (!isset($relations[$relationName])) {
$relations[$relationName] = $relation;
//add columns
if ($localColumns = $relation->getLeftColumns()) {
foreach ($localColumns as $col) {
$fields2[$col->getPhpName()] = $col;
}
}
$relations[ucfirst($relationName)] = $relation;
$cols = $relation->getRightTable()->getColumns();
foreach ($cols as $col) {
if ($relation->getType() == RelationMap::ONE_TO_ONE || $relation->getType() == RelationMap::MANY_TO_ONE) {
$fields2[$relationName . '.' . $col->getPhpName()] = $col;
} else {
$relationFields[ucfirst($relationName)][] = $col->getPhpName();
}
}
}
}
} else {
if (is_array($fields)) {
$fields = array_unique($this->extractSelection($fields));
foreach ($fields as $field) {
$relationFieldSelection = [];
if (($pos = strpos($field, '.')) !== false) {
$relationName = ucfirst(substr($field, 0, $pos));
$relationFieldSelection = explode(',', str_replace(' ', '', ucfirst(substr($field, $pos + 1))));
} else {
$relationName = ucfirst($field);
}
$originalRelationName = $relationName;
$relationName = $pluralizer->getSingularForm($relationName);
if ($relationName && $tableMap->hasRelation($relationName)) {
// $relationName = $pluralizer->getSingularForm($relationName);
$relation = $tableMap->getRelation($relationName);
//select at least all pks of the foreign table
$pks = $relation->getRightTable()->getPrimaryKeys();
foreach ($pks as $pk) {
$relationFields[ucfirst($originalRelationName)][] = $pk->getPhpName();
}
if (isset($relationFieldSelection[0]) && '*' === $relationFieldSelection[0]) {
foreach ($relation->getRightTable()->getColumns() as $col) {
if (!$col->isPrimaryKey()) {
$relationFields[ucfirst($originalRelationName)][] = $col->getPhpName();
}
}
} else {
foreach ($relationFieldSelection as $relationField) {
//check if $relationField exists in the foreign table
if (!$relation->getRightTable()->hasColumnByPhpName($relationField)) {
throw new \RuntimeException("Table {$relation->getRightTable()->getName()} in relation {$relation->getName()} does not have column {$relationField}");
}
$relationFields[ucfirst($originalRelationName)][] = $relationField;
}
}
$relations[ucfirst($originalRelationName)] = $relation;
//add foreignKeys in main table.
if ($localColumns = $relation->getLeftColumns()) {
foreach ($localColumns as $col) {
$fields2[$col->getPhpName()] = $col;
}
}
continue;
}
if ($tableMap->hasColumnByPhpName(ucfirst($field)) && ($column = $tableMap->getColumnByPhpName(ucfirst($field)))) {
$fields2[$column->getPhpName()] = $column;
continue;
}
$rels = implode(',', array_keys($tableMap->getRelations()));
throw new \RuntimeException("In table {$tableMap->getName()} does not have field `{$field}` nor relation `{$relationName}` [{$rels}].");
}
}
}
//filer relation fields
foreach ($relationFields as $relation => &$objectFields) {
$relationDef = $this->getDefinition()->getField($relation);
if (!$relationDef) {
continue;
}
$def = $this->objects->getDefinition($relationDef->getObject());
$limit = $def['blacklistSelection'];
if (!$limit) {
continue;
}
$allowedFields = strtolower(',' . str_replace(' ', '', trim($limit)) . ',');
$filteredFields = array();
foreach ($objectFields as $name) {
if (strpos($allowedFields, strtolower(',' . $name . ',')) === false) {
$filteredFields[] = $name;
}
}
$objectFields = $filteredFields;
}
//filter
if ($blacklistSelection = $this->definition->getBlacklistSelection()) {
$blacklistedFields = strtolower(',' . str_replace(' ', '', trim($blacklistSelection)) . ',');
$filteredFields = array();
foreach ($fields2 as $name => $def) {
if (strpos($blacklistedFields, strtolower(',' . $name . ',')) === false) {
$filteredFields[$name] = $def;
}
}
$filteredRelations = array();
foreach ($relations as $name => $def) {
if (strpos($blacklistedFields, strtolower(',' . $name . ',')) === false) {
$filteredRelations[$name] = $def;
}
}
return array($filteredFields, $filteredRelations, $relationFields);
}
return array($fields2, $relations, $relationFields);
}