query builder:包含复合列的IN子句

时间:2016-06-20 09:37:17

标签: 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)
)

从这样的数组开始:

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

使用cake3查询构建器。我试过

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

但是我收到了错误:

  

无法将值转换为字符串

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

1 个答案:

答案 0 :(得分:4)

AFAICT这是不可能的(还)使用数组语法或常规比较表达式,负责转换的代码只处理单个字段和平面数组,参见

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

但是,使用元组比较表达式可以很好地实现这一点,该表达式支持处理开箱即用的元组集。在内部,协会使用它来处理复合键。

position: absolute; 
left: calc(64.2571% - 1px); 
top: 100px; 
width: 46px; 
height: 10px;

<强> Source > \Cake\Database\Expression\TupleComparison