Jarves\Storage\Propel::getFields PHP Method

getFields() public method

If '*' we return all allowed fields.
public getFields ( array | string $fields ) : array
$fields array | string
return array
    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);
    }