Exemple #1
0
 /**
  * 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;
 }
Exemple #2
0
 /**
  * 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);
 }