我正在将一个小型邮件应用程序放在我的应用程序中,并且遇到了一个奇怪的错误 - 甚至只是按照高级查询的说明进行操作。我需要获取-just-名为的邮箱:
$CoreMailboxes = TableRegistry::get('CoreMailboxes');
$query = $CoreMailboxes->find()
->where(function (QueryExpression $exp, Query $q) {
return $exp->isNotNull('name');
});
$query->hydrate(false);
return $query->toArray();
这是一个近乎重复的,没有" hydrate:false",这是Cake Cookbook中的例子。但是,它给了我一个错误
Argument 1 passed to App\Model\Table\CoreMailboxesTable::App\Model\Table\{closure}() must be an instance of App\Model\Table\QueryExpression, instance of Cake\Database\Expression\QueryExpression given
Cookbook中的查询是:
$query = $cities->find()
->where(function (QueryExpression $exp, Query $q) {
return $exp->isNotNull('population');
});
我做错了什么?
答案 0 :(得分:2)
您不需要将查询表达式用于这样一个简单的查询。 你可以把'不是空''在哪里...... 现在重新使用查询并创建一个更有用的finder(),表达式可能更有用
$result = $this->Table->find()
->where([
'TableName.column_name IS NOT NULL'
])->toArray();
答案 1 :(得分:1)
问题是你的第一个参数的实例定义,doc很清楚:
传递的匿名函数将接收\ Cake \ Database \ Expression \ QueryExpression的实例作为其第一个参数,并将\ Cake \ ORM \ Query作为其第二个参数
也许你没有设置这个类的正确命名空间,试试这个:
<?php
use \Cake\Database\Expression\QueryExpression as QueryExp;
//more code
//more code
->where(function (QueryExp $exp, Query $q) {
//more code
答案 2 :(得分:0)
我今天遇到了同样的错误。 尝试添加
use Cake\ORM\Query;
use Cake\Database\Expression\QueryExpression;
在控制器的开头。对我来说是有帮助的。 我也尝试了kip的答案,但在我的情况下不起作用