2 Stimmen

SQL::Abstract::Limit scheitert an der OR-Logik

Ich versuche, eine OR logische Abfrage mit Class::DBI / Class::DBI::AbstractSearch . Mein Code sieht in etwa so aus:

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

Nach Angaben von die Dokumentation sollte dies funktionieren. Es heißt, dass die Informationen an SQL::Abstract::Limit was sich als Einnahme der logic Parameter. Leider zeigt MySQL im Abfrageprotokoll Folgendes an (der Kürze halber bearbeitet und unter der Annahme einer Suche nach "123"):

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

Ich habe versucht, die 'or' a 'OR' (albern, aber einen Versuch wert), was nicht funktioniert hat. Ich habe auch versucht, die Logik in SQL::Abstract::Limit aber dieser Operator wird übergeben an SQL::Abstract stattdessen.

Wie erhalte ich SQL::Abstract::Limit zu akzeptieren OR Logik von Class::DBI ?

Wie Class::DBI ruft auf. SQL::Abstract::Limit
Ich konnte feststellen, wie SQL::Abstract::Limit wird gerade gebaut. Ich habe Werte anstelle der Variablennamen eingegeben, damit es leichter zu lesen ist.

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

1voto

bvr Punkte 9657

Sie können OR vor Ort wie folgt anwenden:

use SQL::Abstract;

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

gibt ein $stmt :

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

En logic Eigenschaft kann in SQL::Abstract Konstruktor, aber ich habe keine Idee, wie man von Class::DBI .

編集 : Ich weiß nicht, ob es ein Bug oder ein Feature ist, aber die Operatoren werden von logic Klausel scheint nur zu gelten, wenn Sie mit arrayrefs definieren. Mit hashrefs, erhalten Sie immer 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 ? ) )

Oder, um zu arbeiten mit Class::DBI :

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X