2016-06-20 13 views
1

Ich brauche eine IN-Bedingungen auf mehrere Spalten zu erstellen, wie dieseQuery Builder: IN-Klausel mit Verbundstützen

... 
WHERE 
(order_date, order_number) IN (
    ('2016-03-11', 3455453), 
    ('2016-03-18', 83545454), 
    ('2016-06-17', 5354544) 
) 

aus einem Array wie folgt beginnen:

$orders = [ 
    ['2016-03-11', 3455453], 
    ['2016-03-18', 83545454], 
    ['2016-06-17', 5354544] 
]; 

cake3 Query Builder verwenden. Ich habe versucht, mit

->where(['(order_date, order_number) IN' => $orders]); 

aber ich erhalte eine Fehlermeldung:

Cannot convert value to string

Ich weiß, dass es nicht schwer ist, manuell die Abfrage zu erstellen, um das Array zu manipulieren, aber ich würde gerne wissen, ob es ein Kuchen Weg es zu tun.

+0

Ist das, was Sie [gültig IN Syntax] zu tun versuchen (http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html #funktion_in)? Ich denke du suchst nach "OR". – AD7six

+0

Oh 'IN kann verwendet werden, um Zeilenkonstruktoren zu vergleichen:' - heh hat das nie gewusst/gelesen. Ich erwarte nicht, dass es dafür eine eingebaute Methode gibt, es ist nicht üblich (zumindest IME). – AD7six

+0

Ich denke, es ist eine gültige IN-Syntax. In der Tat sagt das Handbuch, dass _IN verwendet werden kann, um Zeilenkonstruktoren zu vergleichen. Es funktioniert auch in meiner Anwendung (auch wenn ich zustimme, dass nicht immer _works_ bedeutet, dass es gültig ist). Natürlich kann ich es durch eine äquivalente OR-Klausel ersetzen, aber das IN scheint meiner Meinung nach kompakter zu sein – arilia

Antwort

4

AFAICT dies nicht möglich ist (noch) nicht mit der Array-Syntax oder regelmäßigen Vergleichsausdrücke, den Code für die Umwandlung nur einzelne Felder und flachen Arrays Griffe,

Source > \Cake\Database\Expression\Comparison::_stringExpression()

jedoch sehen, ist dies Sehr gut möglich mit einem Tupel-Vergleichsausdruck, der das Handling von Tupelsets aus der Box unterstützt. Intern wird es von Zuordnungen zum Verarbeiten von zusammengesetzten Schlüsseln verwendet.

use Cake\Database\Expression\TupleComparison; 

// ... 

$fields = ['order_date', 'order_number']; 
$types = ['date', 'integer']; 

$query->where(
    new TupleComparison($fields, $orders, $types, 'IN') 
); 

Source > \Cake\Database\Expression\TupleComparison

+0

es funktioniert super! Vielen Dank – arilia