lithium\data\source\Database::_schema PHP Method

_schema() protected method

Helper method for data\model\Database::shema()
protected _schema ( Query $query, array | null $fields = null ) : array
$query lithium\data\model\Query A Query instance.
$fields array | null Array of formatted fields.
return array
    protected function _schema($query, $fields = null)
    {
        $model = $query->model();
        $paths = $query->paths($this);
        $models = $query->models($this);
        $alias = $query->alias();
        $result = array();
        if (!$model) {
            foreach ($fields as $field => $value) {
                if (is_array($value)) {
                    $result[$field] = array_keys($value);
                } else {
                    $result[''][] = $field;
                }
            }
            return $result;
        }
        if (!$fields) {
            foreach ($paths as $alias => $relation) {
                $model = $models[$alias];
                $result[$relation] = $model::schema()->names();
            }
            return $result;
        }
        $unalias = function ($value) {
            if (is_object($value) && isset($value->scalar)) {
                $value = $value->scalar;
            }
            $aliasing = preg_split("/\\s+as\\s+/i", $value);
            return isset($aliasing[1]) ? $aliasing[1] : $value;
        };
        if (isset($fields[0])) {
            $raw = array_map($unalias, $fields[0]);
            unset($fields[0]);
        }
        $fields = isset($fields[$alias]) ? array($alias => $fields[$alias]) + $fields : $fields;
        foreach ($fields as $field => $value) {
            if (is_array($value)) {
                if (isset($value['*'])) {
                    $relModel = $models[$field];
                    $result[$paths[$field]] = $relModel::schema()->names();
                } else {
                    $result[$paths[$field]] = array_map($unalias, array_keys($value));
                }
            }
        }
        if (isset($raw)) {
            $result[''] = isset($result['']) ? array_merge($raw, $result['']) : $raw;
        }
        return $result;
    }