php - 如何在 CakePHP 3.x 中的 MySQL IN 子句中使用多个列?

标签 php mysql arrays cakephp cakephp-3.x

我正在尝试通过 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之后和括号之前的额外引号。

我正在寻找以下解决方案之一:

  1. 有没有办法指定正确的参数类型 帮助 CakePHP 正确转换为 double 型字符串 维数组?
  2. 如果我自己尝试字符串转换,如 如上所述,如何避免自动放置报价?

我还想了解有关为什么 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/

相关文章:

php - 正则表达式 - 排除字符串的否定前瞻

php - 在 MySQL/PHP 查询中有效显示 strtotime()

mysql - 我应该使用什么 MySQL 时间格式

php - 如何检查年度日期条件

C缩写数组命名

arrays - codeigniter 在 session 中传递数组并检索

php - Laravel 队列独立 "isDownForMaintenance"错误

php - 将数据发布到 MySql 表时出现问题 - 表仍为空

php - 加快对同一mysql服务器、不同表的请求

mysql - INSERTing 不在表中的行