CakePHP 3高级查询不是空的,有奇怪的" QueryExpression"错误?

时间:2018-03-20 01:03:25

标签: php cakephp-3.0

我正在将一个小型邮件应用程序放在我的应用程序中,并且遇到了一个奇怪的错误 - 甚至只是按照高级查询的说明进行操作。我需要获取-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');
        }); 

我做错了什么?

3 个答案:

答案 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的答案,但在我的情况下不起作用