NAME
Gideon::Manual::Finding - Finding objects
VERSION
version 0.0.3
DESCRIPTION
The Gideon API defines two methods for finding records: find
and find_one
find( [%opts] )
Find is used for finding one or more records within your data store, the query DSL may vary from different providers. In the case of the DBI driver it uses the SQL::Abstract interface, for example
# Search all
Class->find;
# Search object with id = 1
Class->find( id => 1 )
# Search object using like
Class->find( name => { like => 'Doe' } );
# Complex search
Class->find( name => [ { like => 'Doe' }, { 'not like' => 'John' } ] );
You can additionally request a particular sorting criteria, or limit. To do that you need to add -order
and -limit
in your options
# Search all order by id descending
Class->find( -order => { -desc => 'id' } )
# Search first 10 elements
Class->find( -limit => 10 )
# Next page
Class->find( -limit => 10, -offset => 10);
Another particular aspect of Gideon is that find
behaves differently depending on the calling context.
find( [%opts] )
in Scalar Context
When called in scalar context it returns a Gideon::ResultSet object and does not retrieve object from the data store deferring the operation to when results are really needed. This allows you to, for instance, combine different searches together.
# Find in scalar context
my $grown_ups = Poeple->find( age => { '>' => 16 } );
my $us_grown_ups = $grown_ups->find( country => 'US' );
# This has the same effect as
# my $usa_grown_ups = Poeple->find( age => { '>' => 16 }, country => 'US' );
say $_->name for $usa_grown_ups;
find
in Array Context
When find is called in Array Context it queries the data store immediately and returns an array with the results.
# Same results as previous example
say $_->name for Poeple->find( age => { '>' => 16 }, country => 'US' );
find_one( [%opts] )
find_one
is a shortcut to search one record only, in case there are multiple results it will only return the first object, if -order
is not provided it will return the first result using data store's natural ordering
my $first_grown_up = People->find_one( age => { '>' => 16 } );
say $first_grown_up->name;
The you can use the same %opts
as with the find
method with one exception: limit
is not used as it is forced to 1
NAME
Finding objects with Gideon
VERSION
version 0.0.3
AUTHOR
Mariano Wahlmann, Gines Razanov
COPYRIGHT AND LICENSE
This software is copyright (c) 2013 by Mariano Wahlmann, Gines Razanov.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.