SQL :: Abstract :: Предел сбой при логике ИЛИ - PullRequest
2 голосов
/ 18 февраля 2011

Я пытаюсь создать логический запрос OR, используя Class::DBI / Class::DBI::AbstractSearch.Мой код выглядит примерно так:

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

Согласно документации это должно работать.В нем говорится, что информация передается в 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 Ответ

1 голос
/ 18 февраля 2011

Вы можете применить ИЛИ локально следующим образом:

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 вы всегда получаете AND:

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'}
);
...