Loading an existing object or objects
$obj->load()
$obj->load_iter()
You can load an object from the datastore using the load method. load
is by far the most complicated method, because there are many different ways
to load an object: by ID, by column value, by using a join with another type
of object, etc.
In addition, you can load objects either into an array (load), or by using
an iterator to step through the objects (load_iter).
load has the following general form:
my $object = MT::Foo->load( $id );
my @objects = MT::Foo->load(\%terms, \%arguments);
my @objects = MT::Foo->load(\@terms, \%arguments);
load_iter has the following general form:
my $iter = MT::Foo->load_iter(\%terms, \%arguments);
my $iter = MT::Foo->load_iter(\@terms, \%arguments);
Both methods share the same parameters; the only difference is the manner in which they return the matching objects.
If you call load in scalar context, only the first row of the array
@objects will be returned; this works well when you know that your load
call can only ever result in one object returned - for example, when you load
an object by ID.
\%terms should be either:
The numeric ID of an object in the datastore.
A reference to a hash.
The hash should have keys matching column names and the values are the values for that column.
For example, to load an MT::Foo object where the foo column is
equal to bar, you could do this:
my @foo = MT::Foo->load({ foo => 'bar' });
In addition to a simple scalar, the hash value can be a reference to an array;
combined with the range setting in the \%arguments list, you can use
this to perform range searches. If the value is a reference, the first element
in the array specifies the low end of the range, and the second element the
high end.
- A reference to an array.
In this form, the arrayref contains a list of selection terms for more complex selections.
my @foo = MT::Foo->load( [ { foo => 'bar' }
=> -or => { foo => 'baz' } ] );
The separating operator keywords inbetween terms can be any of -or,
-and, -or_not, -and_not (the leading ‘-’ is not required, and the
operator itself is case-insensitive).
Values assigned to terms for selecting data can be either simple or complex in nature. Simple scalar values require an exact match. For instance:
my @foo = MT::Foo->load( { foo => 'bar' });
This selects all MT::Foo objects where foo == 'bar'. But you can provide
a hashref value to provide more options:
my @foo = MT::Foo->load( { foo => { like => 'bar%' } });
This selects all MT::Foo objects where foo starts with ‘bar’. Other
possibilities include not_like, not_null, not, between, >,
>=, <, <=, !=. Note that not and between both accept an
arrayref for their value; between expects a two element array, and
not will accept an array of 1 or more values which translates to
a NOT IN (...) SQL clause.
\%arguments should be a reference to a hash containing parameters for the
search. The following parameters are allowed:
sort => “column”
Sort the resulting objects by the column column; column must be an
indexed column (see “indexes”, above).
Sort may also be specified as an arrayref of multiple columns to sort on. For example:
sort => [
{ column => "column_1", desc => "DESC" },
{ column => "column_2", } # default direction is 'ascend'
]
direction => “ascend|descend”
To be used together with a scalar sort value; specifies the sort
order (ascending or descending). The default is ascend.
limit => “N”
Rather than loading all of the matching objects (the default), load only
N objects.
offset => “M”
To be used together with limit; rather than returning the first N
matches (the default), return matches M through N + M.
start_val => “value”
To be used together with limit and sort; rather than returning the
first N matches, return the first N matches where column (the sort
column) is greater than value.
range
To be used together with an array reference as the value for a column in
\%terms; specifies that the specific column should be searched for a range
of values, rather than one specific value.
The value of range should be a hash reference, where the keys are column
names, and the values are all 1; each key specifies a column that should
be interpreted as a range.
MT::Foo->load( { created_on => [ '20011008000000', undef ] },
{ range => { created_on => 1 } } );
This selects MT::Foo objects whose created_on date is greater than
2001-10-08 00:00:00.
range_incl
Like the ‘range’ attribute, but defines an inclusive range.
join
Can be used to select a set of objects based on criteria, or sorted by
criteria, from another set of objects. An example is selecting the N
entries most recently commented-upon; the sorting is based on MT::Comment
objects, but the objects returned are actually MT::Entry objects. Using
join in this situation is faster than loading the most recent
MT::Comment objects, then loading each of the MT::Entry objects
individually.
Note that join is not a normal SQL join, in that the objects returned are
always of only one type - in the above example, the objects returned are only
MT::Entry objects, and cannot include columns from MT::Comment objects.
join has the following general syntax:
join => MT::Foo->join_on( JOIN_COLUMN, I<\%terms>, I<\%arguments> )
Use the actual MT::Object-descended package name and the join_on static method
providing these parameters: JOIN_COLUMN is the column joining the two
object tables, \%terms and \%arguments have the same meaning as they do
in the outer load or load_iter argument lists: they are used to select
the objects with which the join is performed.
For example, to select the last 10 most recently commmented-upon entries, you could use the following statement:
my @entries = MT::Entry->load(undef, {
'join' => MT::Comment->join_on( 'entry_id',
{ blog_id => $blog_id },
{ 'sort' => 'created_on',
direction => 'descend',
unique => 1,
limit => 10 } )
});
In this statement, the unique setting ensures that the MT::Entry
objects returned are unique; if this flag were not given, two copies of the
same MT::Entry could be returned, if two comments were made on the same
entry.
unique
Boolean flag that ensures that the objects being returned are unique.
This is really only useful when used within a join, because when loading
data out of a single object datastore, the objects are always going to be
unique.
window_size => “N”
An optional attribute used only with the load_iter method. This attribute
is used when requesting a result set of large or unknown size. If the
load_iter method is called without any limit attribute, this is set to
a default value of 100 (meaning, load 100 objects per SELECT). The iterator
will yield the specified number of objects and then issue an additional
select operation, using the same terms and attributes, adjusting for
a new offset for the next set of objects.