X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FManual%2FCookbook.pod;h=293363d59dd4ec58fb7ca9ee5c45367b3cb9fcfb;hb=d044935bac610dcd724998254c6eefffd06607eb;hp=91559736fead921f5a3366e791d23d4669ed17af;hpb=e1540ee0230804b9bc519357b703a9d1f09bce7b;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Manual/Cookbook.pod b/lib/DBIx/Class/Manual/Cookbook.pod index 9155973..293363d 100644 --- a/lib/DBIx/Class/Manual/Cookbook.pod +++ b/lib/DBIx/Class/Manual/Cookbook.pod @@ -68,6 +68,41 @@ This results in the following C clause: For more information on generating complex queries, see L. +=head2 Retrieve one and only one row from a resultset + +Sometimes you need only the first "top" row of a resultset. While this can be +easily done with L<< $rs->first|DBIx::Class::ResultSet/first >>, it is suboptimal, +as a full blown cursor for the resultset will be created and then immediately +destroyed after fetching the first row object. +L<< $rs->single|DBIx::Class::ResultSet/single >> is +designed specifically for this case - it will grab the first returned result +without even instantiating a cursor. + +Before replacing all your calls to C with C please observe the +following CAVEATS: + +=over + +=item * +While single() takes a search condition just like search() does, it does +_not_ accept search attributes. However one can always chain a single() to +a search(): + + my $top_cd = $cd_rs -> search({}, { order_by => 'rating' }) -> single; + + +=item * +Since single() is the engine behind find(), it is designed to fetch a +single row per database query. Thus a warning will be issued when the +underlying SELECT returns more than one row. Sometimes however this usage +is valid: i.e. we have an arbitrary number of cd's but only one of them is +at the top of the charts at any given time. If you know what you are doing, +you can silence the warning by explicitly limiting the resultset size: + + my $top_cd = $cd_rs -> search ({}, { order_by => 'rating', rows => 1 }) -> single; + +=back + =head2 Arbitrary SQL through a custom ResultSource Sometimes you have to run arbitrary SQL because your query is too complex @@ -870,6 +905,12 @@ as follows: __PACKAGE__->has_many('pages' => 'Page', 'book', { order_by => \'page_number DESC'} ); +=head2 Filtering a relationship result set + +If you want to get a filtered result set, you can just add add to $attr as follows: + + __PACKAGE__->has_many('pages' => 'Page', 'book', { where => { scrap => 0 } } ); + =head2 Many-to-many relationships This is straightforward using L: