2011-02-18 31 views
2

我正在尝试使用Class::DBI/Class::DBI::AbstractSearch创建一个OR逻辑查询。我的代码看起来像这样:SQL ::摘要::限制在OR逻辑失败

my $results = Example::CDBI::Quote->search_where(
    { field_1 => {'like', $search_string}, 
     field_2 => {'like', $search_string}}, 
    {logic => 'or'} 
); 

根据the documentation这应该工作。它表示信息被传递到SQL::Abstract::Limit,显示为logic参数。不幸的是,MySQL的显示在查询日志中的以下(编辑为简洁起见,假设搜索的“123”):

SELECT * FROM quote WHERE ((field_1 LIKE '123' AND field_2 LIKE '123')) 

我已经试图改变'or''OR'(愚蠢的,但值得一试),它没有工作。我也尝试搜寻SQL::Abstract::Limit中的逻辑,但是此运算符正在被传递给SQL::Abstract

如何获得SQL::Abstract::Limit接受OR逻辑Class::DBI

Class::DBI电话SQL::Abstract::Limit
我怎么能够确定SQL::Abstract::Limit是如何被构建。我将值放入变量名中,以便更易于阅读。

my $sql = SQL::Abstract::Limit->new({'logic' => 'OR'}); 
my($phrase, @bind) = $sql->where(
    {'field_1'=>{'like' => '123'},'field_2'=>{'like'=>'123'}}, 
    undef, undef, undef); 

回答

1

您可以申请或在本地是这样的:

use SQL::Abstract; 

my $sql = SQL::Abstract->new; 
my ($stmt, @bind) = $sql->where(
    { -or => [ { field_1 => { 'like', 'John' }}, 
       { field_2 => { 'like', 'John' }}, 
      ], 
    }, []); 

给出$stmt

WHERE ((field_1 LIKE ? OR field_2 LIKE ?)) 

logic属性可以在SQL::Abstract构造函数中设置的,但我没有想法如何从Class::DBI传播。

编辑:我不知道这是否是错误或功能,但它通过logic条款改变了运营商似乎只有当你与arrayrefs定义适用。随着hashrefs,你总是和:

my $sql_and = SQL::Abstract::Limit->new(logic => 'AND'); 
my $sql_or = SQL::Abstract::Limit->new(logic => 'OR'); 

say $sql_and->where(['field_1'=>{'like' => '123'},'field_2'=>{'like'=>'123'}]); 
# WHERE ((field_1 LIKE ? AND field_2 LIKE ?)) 

say $sql_or->where (['field_1'=>{'like' => '123'},'field_2'=>{'like'=>'123'}]); 
# WHERE ((field_1 LIKE ? OR field_2 LIKE ?)) 

或者与Class::DBI工作:

my $results = Example::CDBI::Quote->search_where(
    [ field_1 => {'like', $search_string}, 
     field_2 => {'like', $search_string}], 
    {logic => 'or'} 
); 
+0

我平添了几分细节类:: DBI是如何调用SQL ::摘要和::限制。 – 2011-02-18 18:26:52