【问题标题】:Cakephp 3 model find fails with contain anonymous functionCakephp 3 模型查找失败并包含匿名函数
【发布时间】:2019-06-22 13:43:23
【问题描述】:

我在这个简单的查询中得到“发生内部服务器错误”:

$query = $this->find()
    ->contain(['CatLang' => function(Query $q) use($i18n){
      return $q->where(['CatLang.i18n' => $i18n]);
    }])
    ->where(['Categories.id' => $categoryId]);

$category = $query->first();

表格看起来像这样,简化后:

  categories
    id

  cat_lang
    category_id
    i18n

模型被命名为 CategoriesTable 和 CatLangTable,都扩展了 Table。

CatLangTable 属于类别:

$this->belongsTo('Categories');

..and 类别有很多 CatLangs:

$this->hasMany('CatLang');

查询是从 CategoriesTable 中的函数运行的。 mysql 中的工作查询如下所示:

SELECT * FROM categories AS c 
INNER JOIN cat_lang as cl ON cl.category_id=c.id
WHERE c.id=13
AND cl.i18n='sv'

此查询将从 id 为 13 的类别中的一行返回结果集,并与 cat_lang 中的一行连接,其中 i18n 等于“sv”。 (category_id 和 i18n 具有唯一索引。)

谁能给我建议,我做错了什么?

使用 cakephp 3.5.17、php 7 和 mysql 5.7。

【问题讨论】:

  • 要获取有关错误的更多详细信息,enable debug mode,并检查您的错误日志。
  • 我把它打开了,我得到了这个:错误:[TypeError] 传递给 App\Model\Table\CategoriesTable::App\Model\Table\{closure}() 的参数 1 必须是一个实例App\Model\Table\Query 的实例,Cake\ORM\Query 的实例,在第 195 行的 vendor\cakephp\cakephp\src\ORM\Association\Loader\SelectLoader.php 中调用。
  • 这意味着您没有 imported 名称(正确地)在 $q 参数的闭包类型提示中使用。在类型提示中使用完全限定名称,即\Cake\ORM\Query $q,或将其添加到您的导入中,即use Cake\ORM\Query。
  • 谢谢 ndm,我忘记了。我刚刚尝试过,但令我失望的是,没有任何变化。我添加了“使用 Cake\ORM\Query;”和“使用 Cake\ORM\Table;”在文件的顶部,无济于事。顺便提一句。我实际上是从文档中复制代码:book.cakephp.org/3.0/en/orm/…
  • ndm!它确实奏效了。我添加了一些破坏代码的调试。您可以发布您的答案,以便我将其标记为正确答案吗?非常感谢!

标签: php mysql cakephp-3.0


【解决方案1】:

我的错。正如 ndm 在 cmets 中指出的那样,我完全错过了导入 Query 命名空间。

use Cake\ORM\Query;

如果我愿意阅读它,错误消息就足够清楚了::-)

App\Model\Table\CategoriesTable::App\Model\Table\{closure}() 
must be an instance of App\Model\Table\Query, 
instance of Cake\ORM\Query given

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多