查询生成器:带有复合列的 IN 子句

ari*_*lia 1 php mysql cakephp cakephp-3.0

我需要在多列上创建一个 IN 条件,就像这样

...
WHERE 
(order_date, order_number) IN (
    ('2016-03-11', 3455453), 
    ('2016-03-18', 83545454), 
    ('2016-06-17', 5354544)
)
Run Code Online (Sandbox Code Playgroud)

从这样的数组开始:

$orders = [
    ['2016-03-11', 3455453], 
    ['2016-03-18', 83545454], 
    ['2016-06-17', 5354544]
];
Run Code Online (Sandbox Code Playgroud)

使用 cake3 查询生成器。我试过

->where(['(order_date, order_number) IN' => $orders]);
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

无法将值转换为字符串

我知道手动创建操作数组的查询并不难,但我想知道是否有一种蛋糕的方法来做到这一点。

ndm*_*ndm 6

AFAICT(还)使用数组语法或正则比较表达式是不可能的,负责转换的代码仅处理单个字段和平面数组,请参阅

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

然而,这很可能使用元组比较表达式,它支持开箱即用地处理元组集。在内部,它被关联用于处理复合键。

$fields = ['order_date', 'order_number'];
$types = ['date', 'integer'];
$values = [
    ['2016-03-11', 3455453], 
    ['2016-03-18', 83545454], 
    ['2016-06-17', 5354544]
];

$query->where(
    new \Cake\Database\Expression\TupleComparison($fields, $values, $types, 'IN')
);
Run Code Online (Sandbox Code Playgroud)

源 > \Cake\Database\Expression\TupleComparison