[dancer-users] Example of pagination with DBIC?
Jacques Lareau
jack.lareau at gmail.com
Wed Oct 15 22:29:44 BST 2014
Please check the gist, there's errors in my reply.
On Wed, Oct 15, 2014 at 5:25 PM, Jacques Lareau <jack.lareau at gmail.com>
wrote:
> Here is how I do it. Check the gist for better formatting.
>
> https://gist.github.com/jacqueslareau/1e9dcc04d416e1216161
>
> status_ok is because it's an API. You can use the value returned in a
> template instead.
>
> ------------------------
>
> get '/' => sub {
>
> my $rows = params->{rows} // 10;
> my $page = params->{page} // 1;
> my $keyword = params->{keyword};
> my $sort_direction = 'desc';
> my $sort_by = 'id';
>
> # make sure to validate parameters
>
> # build your where from your parameters
> my %where;
> $where{description} = { -like => "%$keyword%" } if defined $keyword;
>
> my $things = rset('Project')->search(\%where, {
> page => $page,
> rows => $rows,
> order_by => { '-desc' . $sort_direction => $sort_by },
> });
>
> my @results;
> while ( my $thing = $things->next ) {
> push @results, {
> id => $thing->id,
> description => $thing->description
> };
> }
>
> status_ok({
> results => \@results,
> pagination => {
> total => $projects->pager->total_entries,
> rows => $rows,
> page => $page
> }
> });
>
> }
>
>
> On Wed, Oct 15, 2014 at 5:14 PM, breno <garu at cpan.org> wrote:
>
>> Hey John!
>>
>> First of all, if you're doing a website search, I would recommend against
>> "like" on a database - it gets really slow really fast. Instead you should
>> try something made for full text search like Elasticsearch.
>>
>> Going back to your question: in terms of paging with Dancer and
>> Dancer::Plugin::DBIC, this is what you could do:
>>
>> ----------------8<-----------------
>> get '/search' => sub {
>> # what the user is searching: (e.g.: /search?q=whatever)
>> my $query = param('q');
>>
>> # which page to render (e.g.: /search?q=whatever&page=2)
>> my $page = param('page');
>>
>> # make sure it's a valid page:
>> $page = 1 unless $page && $page =~ /^\d+$/;
>>
>> # create your search parameters (I'm gonna handwave this one)
>> my %search_params = ( ... );
>>
>> # fetch the proper page on the database
>> my @results = rset('MyRS')->search(
>> \%search_params,
>> {
>> rows => 10, # <=== how many items per page
>> }
>> )->page( $page )->all;
>>
>> template 'mytemplatename', { search_results => \@results };
>> };
>> ---------------->8-----------------
>>
>> Does this help you at all? I would also read through
>> https://metacpan.org/pod/distribution/DBIx-Class/lib/DBIx/Class/Manual/QuickStart.pod
>> and
>> https://metacpan.org/pod/distribution/DBIx-Class/lib/DBIx/Class/Manual/Intro.pod
>> .
>>
>> And of course, if you have any other questions, feel free to ask :)
>>
>> Cheers!
>>
>> garu
>>
>>
>>
>> On Wed, Oct 15, 2014 at 5:29 PM, John Stoffel <john at stoffel.org> wrote:
>>
>>>
>>> Hi all,
>>>
>>> My google-fu is weak and I haven't been able to find a good example of
>>> how to do pagination with Dancer, DBIC and ideally some basic
>>> Javascript to make it look good.
>>>
>>> Here's my basic code that I'm working with right now, which I know is
>>> semi busted, but I just keep hitting roadblocks. The goal here is to
>>> let me spin up quick, but nice search forms for read only mysql DBs
>>> for a library I work with in my spare time. Ideally a CRUD interface
>>> down the line to allow end users to add/edit records. DBIC looks to
>>> be the way to go with this down the line, since it can do proper
>>> records and transactions. At least I think it can.
>>>
>>> Any way, my code:
>>>
>>> package TestDBIC;
>>> use Dancer ':syntax';
>>> use Dancer::Plugin::DBIC qw(schema resultset rset);
>>>
>>> # cd TestDBIC;
>>> # TestDBIC::Schema 'dbi:mysql:dbname=emina;host=quad' emina
>>>
>>> our $VERSION = '0.1';
>>>
>>> get '/' => sub {
>>> template 'search';
>>> };
>>>
>>> post '/results' => sub {
>>> my $name = param 'Name';
>>> my $sex = param 'Sex';
>>> my $city = param 'City';
>>> my $state = param 'State';
>>> my $id = param 'MummyID';
>>>
>>> my @rows;
>>> my $query;
>>> my $q = {};
>>>
>>> my $limit = 10;
>>> my $opts = {};
>>> $opts->{order_by} = { -desc => 'id' };
>>> $opts->{rows} = $limit if defined $limit;
>>> # We need to join in several tables from the schema
>>> $opts->{page} = 1;
>>> $opts->{limit} = 15;
>>> $opts->{order_by} = { 'desc' => 'name'};
>>>
>>> my $rs = schema->resultset('MummyInNorthAmerica');
>>>
>>> if ($name) {
>>> if ($query) { $query .= " AND "; }
>>> $query .= "Name LIKE $name";
>>> $q->{name} = { like => "%$name%" } ;
>>> }
>>>
>>> if ($sex) {
>>> if ($query) { $query .= " AND "; }
>>> $query .= "Sex = $sex";
>>> $q->{sex} = $sex;
>>> }
>>>
>>> @rows = $rs->search($q,$opts)->pager;
>>>
>>> template 'results',
>>> { query => $query,
>>> mummies => \@rows,
>>> rows => 1000
>>> };
>>> };
>>>
>>> true;
>>> _______________________________________________
>>> dancer-users mailing list
>>> dancer-users at dancer.pm
>>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>>
>>
>>
>> _______________________________________________
>> dancer-users mailing list
>> dancer-users at dancer.pm
>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.preshweb.co.uk/pipermail/dancer-users/attachments/20141015/fe1f8e12/attachment.html>
More information about the dancer-users
mailing list