【问题标题】:CakePHP 3 QueryBuilder: condition for few values does not generate 'IN' statementCakePHP 3 QueryBuilder:少数值的条件不会生成“IN”语句
【发布时间】:2015-12-04 09:21:18
【问题描述】:

在 CakePHP 2 中当你写这样的东西时:

$Model->find('all', ['conditions' => ['field' => 1]]);

您将获得如下所示的查询:

SELECT * FROM model WHERE model.field = 1;

或者当你写这样的东西时:

$Model->find('all', ['conditions' => ['field' => [1,2,3,5]]]);

你会得到这样的查询:

SELECT * FROM model WHERE model.field IN (1,2,3,5);

我的意思是,“IN”语句是根据参数类型自动生成的。

另一方面,在 CakePHP 3 中编写时

$Table->find()->where(['field' => [1,2,3]])->all();

你会收到一个错误,例如

无法将值转换为整数

因为它会生成这样的语句:

SELECT * FROM table WHERE table.field = Array();

这是错误还是功能?

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    According to the official docs需要在CakePHP 3中指明列数据类型:-

    $Table->find()->where(['field' => [1,2,3], ['field' => 'integer[]']])->all();
    

    integer[] 告诉 Cake 期待一个整数数组。

    或者,您可以在您的条件中包含IN:-

    $Table->find()->where(['field IN' => [1,2,3]])->all();
    

    如果数据还没有,这两种情况都会将数据转换为数组,这样IN 将在仅传递整数值时按预期工作。

    【讨论】:

    • 谢谢。我只是想知道为什么它不再以以前更简单的方式工作。这是关于性能的吗?
    • 它在 CakePHP 2 中的工作方式可能有点模棱两可并且容易被滥用。例如,没有检查 IN 条件是否真的是预期的,因此如果错误地传递了一个数组,它将使用IN 条件生成一个有效的查询。 CakePHP 3 中的这种更改可能看起来不方便,但对我来说似乎是一种更好的方法,因为您应该知道您的预期条件应该是什么。
    • 只是想从 3.1.2 开始添加它(据我所知),当您忘记“IN”但提供数组参数时,您将得到一个有用的“无法将值转换为string" 错误而不是一般异常。我主要是这样说的,以便当我稍后再次收到此错误并且不记得它的含义时,此页面将出现在 Google 结果中。 :-) 希望它可以帮助处于相同情况的其他人!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2014-05-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多