CakePHP 3 QueryBuilder:少数值的条件不会生成'IN'语句

sik*_*kor 6 php cakephp cakephp-3.0

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

$Model->find('all', ['conditions' => ['field' => 1]]);
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM model WHERE model.field = 1;
Run Code Online (Sandbox Code Playgroud)

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

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

你会得到这样的查询:

SELECT * FROM model WHERE model.field IN (1,2,3,5);
Run Code Online (Sandbox Code Playgroud)

我的意思是,'IN'语句是根据参数的类型自动生成的.

另一方面,当你写的时,CakePHP 3

$Table->find()->where(['field' => [1,2,3]])->all();
Run Code Online (Sandbox Code Playgroud)

你会收到一个错误,例如

无法将值转换为整数

因为它生成如下语句:

SELECT * FROM table WHERE table.field = Array();
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是一个功能?

drm*_*nja 2

根据官方文档,您需要在 CakePHP 3 中指示列数据类型:-

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

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

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

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

如果数据尚未转换为数组,这两种情况都会将其转换为数组,这样,IN如果仅传递整数值,则数据将按预期工作。

  • 只是想补充一点,从 3.1.2 开始(据我所知),当您忘记“IN”但提供数组参数时,您将得到一个有用的“无法将值转换为字符串”错误,而不是通用异常。我这么说主要是为了当我稍后再次遇到此错误并且不记得它的含义时,此页面将出现在 Google 结果中。:-) 希望它可以帮助处于相同情况的其他人! (2认同)