2011-02-18 40 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