/** * Helper method for `data\model\Database::shema()` * * @param data\model\Query $query A Query instance. * @param array $fields Array of formatted fields. */ 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; }
/** * Returns a string of formatted fields to be inserted into the query statement. * * @param array $fields Array of fields. * @param data\model\Query $context Generally a `data\model\Query` instance. * * @return string A SQL formatted string */ public function fields($fields, $context) { $type = $context->type(); $schema = $context->schema()->fields(); $alias = $context->alias(); if (!is_array($fields)) { return $this->_fieldsReturn($type, $context, $fields, $schema); } $context->applyStrategy($this); $fields = $this->_fields($fields ?: $context->fields(), $context); $context->map($this->_schema($context, $fields)); $toMerge = []; if (isset($fields[0])) { foreach ($fields[0] as $val) { $toMerge[] = is_object($val) && isset($val->scalar) ? $val->scalar : $val; } unset($fields[0]); } $fields = isset($fields[$alias]) ? [$alias => $fields[$alias]] + $fields : $fields; foreach ($fields as $field => $value) { if (is_array($value)) { if (isset($value['*'])) { $toMerge[] = $this->name($field) . '.*'; continue; } foreach ($value as $fieldname => $mode) { $toMerge[] = $this->_fieldsQuote($field, $fieldname); } } } return $this->_fieldsReturn($type, $context, $toMerge, $schema); }