CakePHP 3 高级查询 Not Null 出现奇怪的 "QueryExpression" 错误?

CakePHP 3 advanced Query Not Null with strange "QueryExpression" error?

我在我的应用程序中组合了一个小型邮件应用程序,运行 出现了一个奇怪的错误 - 即使只是按照高级查询的说明进行操作。我需要 - 只是 - 名为的邮箱:

    $CoreMailboxes = TableRegistry::get('CoreMailboxes');
    $query = $CoreMailboxes->find()
        ->where(function (QueryExpression $exp, Query $q) {
            return $exp->isNotNull('name');
        });
    $query->hydrate(false);
    return $query->toArray();

这与 Cake Cookbook 中的示例几乎完全相同,没有 "hydrate: false"。但是,它给我一个

的错误
   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');
        }); 

我做错了什么?

问题出在第一个参数的实例定义上,doc 很清楚:

The passed anonymous function will receive an instance of \Cake\Database\Expression\QueryExpression as its first argument, and \Cake\ORM\Query as its second

也许你没有为这个 class 设置正确的命名空间,试试这个:

<?php 

use \Cake\Database\Expression\QueryExpression as QueryExp;

//more code

//more code
    ->where(function (QueryExp $exp, Query $q) {
//more code

这么简单的查询不需要使用查询表达式.. 你可以把 'IS NOT NULL' 放在哪里... 现在 re-use 查询并创建一个更有用的 finder(),表达式可能更有用

$result = $this->Table->find()
  ->where([
     'TableName.column_name IS NOT NULL'
   ])->toArray();

我今天遇到了同样的错误。 尝试添加

use Cake\ORM\Query;
use Cake\Database\Expression\QueryExpression;

在控制器的开头。这对我有帮助。 我也尝试了 kip 的回答,但它在我的情况下不起作用