X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FManual%2FFAQ.pod;h=df0f77373771bec23c167961c4521423548135d0;hb=7f3655d44981a99ddc752ecd7056f5b14be6ae04;hp=fb66f0718af949e730d97f570b36e41196901be3;hpb=fb5fb63c63a1ac486ef42c324c47bc6b012753f8;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Manual/FAQ.pod b/lib/DBIx/Class/Manual/FAQ.pod index fb66f07..df0f773 100644 --- a/lib/DBIx/Class/Manual/FAQ.pod +++ b/lib/DBIx/Class/Manual/FAQ.pod @@ -190,12 +190,12 @@ Then you can use the alias in your C attribute. The first argument to C is a hashref of accessor names and values to filter them by, for example: - ->search({'created_time' => { '>=', '2006-06-01 00:00:00'} }) + ->search({'created_time' => { '>=', '2006-06-01 00:00:00' } }) Note that to use a function here you need to make the whole value into a scalar reference: - ->search({'created_time' => \'>= yesterday() }) + ->search({'created_time' => \'>= yesterday()' }) =item .. search in several tables simultaneously? @@ -205,7 +205,7 @@ then supply the name of the relationship to the C attribute in your search, for example when searching in the Books table for all the books by the author "Fred Bloggs": - ->search({'authors.name' => 'Fred Bloggs'}, { join => 'authors'}) + ->search({'authors.name' => 'Fred Bloggs'}, { join => 'authors' }) The type of join created in your SQL depends on the type of relationship between the two tables, see L @@ -245,10 +245,46 @@ documentation. =over 4 -=item .. fetch as much data as possible in as few select calls as possible? (prefetch) +=item .. fetch as much data as possible in as few select calls as possible? See the prefetch examples in the L. +=item .. fetch a whole column of data instead of a row? + +Call C on a L, this returns a +L, see it's documentation and the +L for details. + +=item .. fetch a formatted column? + +In your table schema class, create a "private" column accessor with: + + __PACKAGE__->add_columns(my_common => { accessor => '_hidden_my_column' }); + +Then, in the same class, implement a subroutine called "my_column" that +fetches the real value and does the formatting you want. + +See the Cookbook for more details. + +=item .. fetch a single (or topmost) row? + +Sometimes you many only want a single record back from a search. A quick +way to get that single row is to first run your search as usual: + + ->search->(undef, { order_by => "id DESC" }) + +Then call L and ask it only to return 1 row: + + ->slice(0,1) + +These two calls can be combined into a single statement: + + ->search->(undef, { order_by => "id DESC" })->slice(0,1) + +Why slice instead of L or L? +If supported by the database, slice will use LIMIT/OFFSET to hint to the database that we +really only need one row. This can result in a significant speed improvement. + =back =head2 Inserting and updating data @@ -290,6 +326,35 @@ scalar reference: ->update({ somecolumn => \'othercolumn' }) +=item .. store JSON/YAML in a column and have it deflate/inflate automatically? + +You can use L to accomplish YAML/JSON storage transparently. + +If you want to use JSON, then in your table schema class, do the following: + + use JSON; + + __PACKAGE__->add_columns(qw/ ... my_column ../) + __PACKAGE__->inflate_column('my_column', { + inflate => sub { jsonToObj(shift) }, + deflate => sub { objToJson(shift) }, + }); + +For YAML, in your table schema class, do the following: + + use YAML; + + __PACKAGE__->add_columns(qw/ ... my_column ../) + __PACKAGE__->inflate_column('my_column', { + inflate => sub { YAML::Load(shift) }, + deflate => sub { YAML::Dump(shift) }, + }); + +This technique is an easy way to store supplemental unstructured data in a table. Be +careful not to overuse this capability, however. If you find yourself depending more +and more on some data within the inflated column, then it may be time to factor that +data out. + =back =head2 Misc @@ -311,7 +376,7 @@ to work around this issue. =item See the SQL statements my code is producing? -Turn on debugging! See L for details of how +Turn on debugging! See L for details of how to turn on debugging in the environment, pass your own filehandle to save debug to, or create your own callback. @@ -324,3 +389,15 @@ search again or relationship accessors. The SQL query is only run when you ask the resultset for an actual row object. =back + +=head2 Notes for CDBI users + +=over 4 + +=item Is there a way to make an object auto-stringify itself as a +particular column or group of columns (a-la cdbi Stringfy column +group, or stringify_self method) ? + +See L + +=back