public function testAliasAndPaths() { $model = 'lithium\\tests\\mocks\\data\\model\\MockQueryComment'; $query = new Query(compact('model')); $this->assertIdentical('MockQueryComment', $query->alias()); $this->assertIdentical('MockQueryComment', $query->alias(true)); $this->assertIdentical('MockQueryComment2', $query->alias('MockQueryComment2')); $this->assertIdentical('MockQueryComment2', $query->alias()); $this->assertIdentical('MockQueryComment2', $query->alias(true)); $this->assertIdentical('MockQueryComment__2', $query->alias('MockQueryComment', 'Model1')); $this->assertIdentical('MockQueryComment2__2', $query->alias('MockQueryComment2', 'Model2')); $this->assertIdentical('MockQueryComment__2', $query->alias(true, 'Model1')); $this->assertIdentical('MockQueryComment2__2', $query->alias(true, 'Model2')); $query = new Query(compact('model') + array('source' => 'my_custom_table', 'alias' => 'MyCustomAlias')); $result = $query->export($this->db); $this->assertIdentical('{my_custom_table}', $result['source']); $this->assertIdentical('AS {MyCustomAlias}', $result['alias']); $this->assertIdentical('MyCustomAlias__2', $query->alias('MyCustomAlias', 'Relation1')); $this->assertIdentical('MyCustomAlias__3', $query->alias('MyCustomAlias', 'Other.Relation2')); $this->assertIdentical('MyCustomAlias2', $query->alias('MyCustomAlias2', 'Other.Other.Relation3')); $this->assertIdentical('MyCustomAlias', $query->alias()); $this->assertIdentical('MyCustomAlias__2', $query->alias(true, 'Relation1')); $this->assertIdentical('MyCustomAlias__3', $query->alias(true, 'Other.Relation2')); $this->assertIdentical('MyCustomAlias2', $query->alias(true, 'Other.Other.Relation3')); $this->assertIdentical('Relation4', $query->alias(null, 'Relation4')); $this->assertIdentical('Relation5', $query->alias(null, 'Other.Relation5')); $this->assertIdentical('Relation5__2', $query->alias(null, 'Other.Other.Relation5')); $this->assertIdentical('Relation4', $query->alias(true, 'Relation4')); $this->assertIdentical('Relation5', $query->alias(true, 'Other.Relation5')); $this->assertIdentical('Relation5__2', $query->alias(true, 'Other.Other.Relation5')); $expected = array('MyCustomAlias' => null, 'MyCustomAlias__2' => 'Relation1', 'MyCustomAlias__3' => 'Other.Relation2', 'MyCustomAlias2' => 'Other.Other.Relation3', 'Relation4' => 'Relation4', 'Relation5' => 'Other.Relation5', 'Relation5__2' => 'Other.Other.Relation5'); $this->assertEqual($expected, $query->paths($this->db)); $model = 'lithium\\tests\\mocks\\data\\model\\MockQueryPost'; $query = new Query(compact('model')); $query->alias(null, 'MockQueryComment'); $query->alias('MockQueryPost2', 'MockQueryComment.MockQueryPost'); $expected = array('MockQueryPost' => null, 'MockQueryComment' => 'MockQueryComment', 'MockQueryPost2' => 'MockQueryComment.MockQueryPost'); $this->assertEqual($expected, $query->paths($this->db)); }
/** * Helper method for `data\model\Database::shema()` * * @param \lithium\data\model\Query $query A Query instance. * @param array|null $fields 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; }