lithium\data\source\Database::read()
Implements
lithium\data\Source::read()
Reads records from a database using a lithium\data\model\Query
object or raw SQL string.
Parameters
-
string|object
$query
lithium\data\model\Query
object or SQL string. -
array
$options
If
$query
is a raw string, contains the values that will be escaped and quoted. Other options:'return'
string: switch return between'array'
,'item'
, or'resource'
string: Defaults to'item'
.
Returns
mixedDetermined by $options['return']
.
Filter
This method can be filtered.
Source
public function read($query, array $options = array()) {
$defaults = array(
'return' => is_string($query) ? 'array' : 'item',
'schema' => null,
'quotes' => $this->_quotes
);
$options += $defaults;
return $this->_filter(__METHOD__, compact('query', 'options'), function($self, $params) {
$query = $params['query'];
$args = $params['options'];
$return = $args['return'];
unset($args['return']);
$model = is_object($query) ? $query->model() : null;
if (is_string($query)) {
$sql = String::insert($query, $self->value($args));
} else {
if (!$data = $self->invokeMethod('_queryExport', array($query))) {
return false;
}
$sql = $self->renderCommand($data['type'], $data);
}
$result = $self->invokeMethod('_execute', array($sql));
if ($return === 'resource') {
return $result;
}
if ($return === 'item') {
return $model::create(array(), compact('query', 'result') + array(
'class' => 'set', 'defaults' => false
));
}
$columns = $args['schema'] ?: $self->schema($query, $result);
if (!is_array(reset($columns))) {
$columns = array('' => $columns);
}
$i = 0;
$records = array();
foreach ($result as $data) {
$offset = 0;
$records[$i] = array();
foreach ($columns as $path => $cols) {
$len = count($cols);
$values = array_combine($cols, array_slice($data, $offset, $len));
($path) ? $records[$i][$path] = $values : $records[$i] += $values;
$offset += $len;
}
$i++;
}
return Set::expand($records);
});
}