lithium\data\source\Database::read()

public method

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

mixed

Determined 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);
		});
	}