我正在尝试通过 CakePHP 3.x 执行以下 SQL,如下所述:
SELECT
COL1,
COL2,
COL3
FROM
Selections
WHERE
ROW (COL1, COL2) NOT IN (
ROW (1, 1),
ROW (2, 2)
);
我已将要过滤的值存储为数组
$filter = [[1 ,1], [2, 2]];
在 CakePHP 3.x Controller 中,我尝试执行以下查询:
$conditions['ROW (Selections.COL1, Selections.COL2) NOT IN'] = $filter;
$options = [
'limit' => 1,
'conditions' => $conditions,
'order' => ['Selections.created' => 'asc']
];
debug($this->Selections->find('all', $options));
$selections = $this->Selections->find('all', $options);
由于以下 CakePHP 3.x 错误,此执行导致失败:
Cannot convert value to string
InvalidArgumentException
在调试对象时,我发现它没有正确的参数类型(下面以粗体标记):
'params' => [
':c0' => [
'value' => [
(int) 0 => [
(int) 0 => (int) 1,
(int) 1 => (int) 1
],
(int) 1 => [
(int) 0 => (int) 2,
(int) 1 => (int) 2
]
],
'type' => **null**,
'placeholder' => 'c2'
]
],
根据我的理解,类型应该是“integer[][]”,以便允许将二维数组正确转换为字符串。但是,类型为 null 可能会干扰正确的转换。
作为替代方案,我尝试内爆 $filter
数组,从而将其转换为具有正确的括号和分隔符集的正确字符串,如下所示:
$filter[] = 'ROW '.implode(', ', [1, 1]);
$conditions['ROW (Selections.COL1, Selections.COL2) NOT IN'] = '('.implode(', ', $filter).')';
这对我来说正确地将数组转换为字符串,但 CakePHP 更进一步,将生成的字符串封装在引号内。这会导致以下查询在 MySQL 数据库服务器上执行期间抛出错误。
SELECT
COL1,
COL2,
COL3
FROM
Selections
WHERE
ROW (COL1, COL2) NOT IN '(
ROW (1, 1),
ROW (2, 2)
)';
请注意NOT IN
之后和括号之前的额外引号。
我正在寻找以下解决方案之一:
- 有没有办法指定正确的参数类型 帮助 CakePHP 正确转换为 double 型字符串 维数组?
- 如果我自己尝试字符串转换,如 如上所述,如何避免自动放置报价?
我还想了解有关为什么 CakePHP 3.x 在上述情况下将参数类型分配为 NULL 的更多信息以及避免这种情况的方法。
如果 CakePHP 中有其他方法可以处理这种情况,那么我将真诚地感谢您的解释。
最佳答案
使用第二种方法自己生成字符串等价物,解决这个问题非常容易:
$filter[] = 'ROW '.implode(', ', [1, 1]);
$conditions['ROW (Selections.COL1, Selections.COL2) NOT IN'] = '('.implode(', ', $filter).')';
第二行应替换为:
$conditions['ROW (Printouts.user_id, Printouts.receiver) NOT IN ('.implode(',',$dispatched).')'];
该死的!只用了不到一行的修改就解决了长达 2 页的问题描述。基本上,可以避免使用 'key' => 'value'
格式指定条件,而只需将整个条件指定为 'value'
。
关于php - 如何在 CakePHP 3.x 中的 MySQL IN 子句中使用多个列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40216727/