lithium\data\Model::find()
The find method allows you to retrieve data from the connected data source.
Examples:
Posts::find('all'); // returns all records
Posts::find('count'); // returns a count of all records
// The first ten records that have `'author'` set to `'Bob'`.
Posts::find('all', [
'conditions' => ['author' => 'Bob'],
'limit' => 10
]);
// First record where the id matches 23.
Posts::find('first', [
'conditions' => ['id' => 23]
]);
Shorthands:
// Shorthand for find first by primary key.
Posts::find(23);
// Also works with objects.
Posts::find(new MongoId(23));
Parameters
-
string|object|integer
$typeThe name of the finder to use. By default the following finders are available. Custom finders can be added via
Model::finder().'all': Returns all records matching the conditions.'first': Returns the first record matching the conditions.'count': Returns an integer count of all records matching the conditions. When usingDatabaseadapter, you can specify the field to count on viafields, when multiple fields are given does a count on all fields ('*').'list': Returns a one dimensional array, where the key is the (primary)p key and the value the title of the record (the record must have a'title'field). A result may look like:[1 => 'Foo', 2 => 'Bar'].
Instead of the name of a finder, also supports shorthand usage with an object or integer as the first parameter. When passed such a value it is equal to
Model::find('first', ['conditions' => ['<key>' => <value>]]).Note: When an undefined finder is tried to be used, the method will not error out, but fallback to the
'all'finder. -
array
$optionsOptions for the query. Common options accepted are:
'conditions'array: The conditions for the query i.e.'array('is_published' => true).'fields'array|null: The fields that should be retrieved. When set tonullor'*'and by default, uses all fields. To optimize query performance, limit the fields to just the ones actually needed.'order'array|string: The order in which the data will be returned, i.e.'created ASC'sorts by created date in ascending order. To sort by multiple fields use the array syntaxarray('title' => 'ASC', 'id' => 'ASC).'limit'integer: The maximum number of records to return.'page'integer: Allows to paginate data sets. Specifies the page of the set together with the limit option specifying the number of records per page. The first page starts at1. Equals limit * offset.'with'array: Relationship names to be included in the query. Also supported are:'offset'integer'having'array|string'group'array|string'joins'array
Returns
mixedThe result/s of the find. Actual result depends on the finder being used. Most
often this is an instance of lithium\data\Collection or lithium\data\Entity.
Filter
Allows to execute logic before querying (i.e. for rewriting of $options) or after i.e. for caching results.
Source
public static function find($type, array $options = []) {
$self = static::_object();
if (is_object($type) || !isset($self->_finders[$type])) {
$options['conditions'] = static::key($type);
$type = 'first';
}
$options += (array) $self->_query;
$meta = ['meta' => $self->_meta, 'name' => get_called_class()];
$params = compact('type', 'options');
$implementation = function($params) use ($meta) {
$options = $params['options'] + ['type' => 'read', 'model' => $meta['name']];
$query = static::_instance('query', $options);
return static::connection()->read($query, $options);
};
if (isset($self->_finders[$type])) {
$finder = $self->_finders[$type];
$reflect = new \ReflectionFunction($finder);
if ($reflect->getNumberOfParameters() > 2) {
$message = 'Old style finder function in file ' . $reflect->getFileName() . ' ';
$message .= 'on line ' . $reflect->getStartLine() . '. ';
$message .= 'The signature for finder functions has changed. It is now ';
$message .= '`($params, $next)` instead of the old `($self, $params, $chain)`. ';
$message .= 'Instead of `$self` use `$this` or `static`.';
trigger_error($message, E_USER_DEPRECATED);
return Filters::bcRun(
get_called_class(), __FUNCTION__, $params, $implementation, [$finder]
);
}
$implementation = function($params) use ($finder, $implementation) {
return $finder($params, $implementation);
};
}
return Filters::run(get_called_class(), __FUNCTION__, $params, $implementation);
}