2/27/2009


比较一下Class::DBI的search和Class::DBI::AbstractSearch的search_where

今天在工作中需要使用Class::DBI::AbstractSearch的search_where去做一个较复杂的查询,结果由于一个小问题,浪费了很多时间,所以在这里简单比较一下Class::DBI的search和Class::DBI::AbstractSearch的search_where,以免以后再犯类似的错误。

先看看Class::DBI的search。如果我们只需要做一个简单的查询,那么用Class::DBI的search就可以了,例如:

my %criteria = (column1 => $value1, column2=>$value2);
my $opts = {order_by=>'column1'};# hash reference
$class->search(%criteria, $opts);

$class可以理解为在数据库中我们要进行查询的那个表(table);%criteria是进行查询的一个标准,即在select语句中where后面的那一部分;另外我们还要经常用到order by,注意这里我们传给search是一个hash引用(hash reference)$opts。

下面再看一个使用Class::DBI::AbstractSearch的例子:

my %criteria = (column1=>$value1, column2=>$value2, show_from=>\'<=now()', show_till=>\'>=now()');
my $opts = {order_by=>'column1'};# hash reference
$class->search_where(\%criteria, $opts);


不知道大家看出来两者的区别没有。首先我们要知道如果只是进行一个简单的查询那么search就可以应付,然而对于复杂一点的查询我们就需要使用search_where(比如这里的show_from=>\'<=now()',show_till=>\'>=now()')。更重要的而且往往被忽略的是这里我们传递给search_where的是"\%criteria"(hash引用)而不是"%criteria"(hash)。我今天就在这里吃到了苦头。

参考:
http://search.cpan.org/~tmtm/Class-DBI-v3.0.17/lib/Class/DBI.pm#search
http://search.cpan.org/~miyagawa/Class-DBI-AbstractSearch-0.07/lib/Class/DBI/AbstractSearch.pm

No comments:

Post a Comment