DBIx-Struct
view release on metacpan or search on metacpan
lib/DBIx/Struct.pod view on Meta::CPAN
=back
=head3 C<filter_timestamp>
Removes microseconds from timestamp columns. Returns object's $self value.
2010-05-19 23:30:01.737126 -> 2010-05-19 23:30:01
=head3 C<fetch>
Fetches the whole row data from table. Useful when primary key is known after
insert but other columns are set by database. Returns object's $self value.
=head3 B<Accessors>
All column names from table except special keywords are accessible via accessors:
my $prim = one_row("prim", 1);
print "payload: " . $prim->payload . "\n";
# new data
$prim->payload("pay never");
$prim->update;
Here $prim->payload("pay never") sets new column value. To store it explicitly
call $prim->update. By default update is called on row object destruction.
To include a random snippet of SQL verbatim, you specify it as a scalar reference.
$client->bonus(\"bonus + 10");
Or with parameters:
$client->bonus([\"bonus + ?", 10]);
This literal SQL expressions can be used for insert values also.
Special form C<_$column> allows to set internal column value without marking
it for actual update in table.
=head4 B<JSON> output support
Every row-object has C<TO_JSON()> function that can be automatically used
by C<JSON> C<encode> function. This C<TO_JSON()> has some flexibility what
to output.
my $user = DBC::Users->findOneByUsername("cruks");
my $json = JSON->new->convert_blessed;
# please pay attention on "id", its value is of number type
print $json->encode($user); # {"username":"cruks","id":1}
# only one field is required
print $json->encode($user->TO_JSON("username")); # {"username":"cruks"}
# one field and more data in output
print $json->encode($user->TO_JSON("username",
{url => "http://site.com/login"})
); # {"username":"cruks","url":"http://site.com/login"}
# just add more data in output
print $json->encode($user->TO_JSON({url => "http://site.com/login"}));
# {"url":"http://site.com/login","username":"cruks","id":1}
=head4 B<JSON> type support
Fields with datatype 'json' or 'jsonb' can be transparently used as perl-structures.
my $row = one_row(table => $id);
# table is like
# id | integer | not null default nextval('table_id_seq'::regclass)
# settings | jsonb |
# row is like
# id | settings
# ----+-----------------------------------------------------------------
# 1 | {"limits": {"low": 15, "max": 100}}
$row->settings->{current}{runner} = 100;
# now row is like this
# id | settings
# ----+-----------------------------------------------------------------
# 1 | {"limits": {"low": 15, "max": 100}, "current": {"runner": 100}}
=head2 Syntax sugar
=head3 find...By...
This is inspired by Spring-Data for Java. This automatically generated function
compiled on first call and selects row(s) or column value(s).
It should be called on table class:
my $authors_name = DBC::Article->findOneFirstNameById($id);
my $authors_names_array_ref = DBC::Article->findFirst10FirstNameByOrderByLastNameAsc;
Format of this find-family is following:
find-func = find<what>By<search>
what = <plural><column><distinct>
plural = All|One|First[$limit] | ''
* One or First or First1 - selects only one row
column = one column name | ''
* returns direct value(s)
distinct = Distinct | ''
* select only distinct values
search = <where><order>
order = OrderBy<column-to-order-by>(Asc|Desc) | ''
where = <column>|<column>And<column>|<column>Or<column>
column = column name | column(LessThanEqual|LessThan|GreaterThanEqual|
GreaterThan|IsNull|IsNotNull|IsNot|NotNull|
NotEquals|NotIn|NotLike|IsEqualTo|IsTrue|
IsFalse|Equals|True|False|Like|Is|Not|In)
Column names are converted from CamelCase to underscore lowercase style:
FirstName -> first_name. More examples:
DBC::User->findAll;
DBC::User->findFirst10ByOrderByLastName;
DBC::User->findByAddressZipCode($zip);
DBC::User->findByLoginDateGreaterThan($date);
DBC::User->findByLoginDateGreaterThanAndReferralIsNull($date);
=head3 Referenced tables
Suppose you have two tables employer and employee:
( run in 1.890 second using v1.01-cache-2.11-cpan-39bf76dae61 )