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

read() public method

Reads records from a database using a lithium\data\model\Query object or raw SQL string.
public read ( string | object $query, array $options = [] ) : mixed
$query string | object `lithium\data\model\Query` object or SQL string.
$options array 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'`.
return mixed Determined by `$options['return']`.
    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);
        });
    }